PDA

View Full Version : چرا کاراکترهام به صورت ؟ می آید



farnaz2003
شنبه 23 تیر 1386, 10:12 صبح
متنی را از فایل با فرمت RTF داخل Richedit باز می کنم و درست است ولی وقتی می خواهم یک خط از Richedit را داخل متغییر String بریزم کاراکترهای خاص از جمله:
ī و āو مشابه آنها بصورت ؟ می آید چکار کنم که موقع ریختن خطی با این کاراکترها در رشته بصورت صحیح بیاید و ؟ نشود.

متن در Richedit:
Mr. Sayyid `Abbās Sadr-`āmelī

متن در String:
Mr. Sayyid `Abb?s Sadr-`?mel?

mehdi_mohamadi
شنبه 23 تیر 1386, 10:59 صبح
برو در کنترل پنل در قسمت regianal and language option تنظیمات فارسی را تصحیح کن

farnaz2003
شنبه 23 تیر 1386, 13:11 عصر
ببخشید تنظیمات فارسی سیستم درست است چون اگر مشکل داشت در Word هم به مشکل بر میخورد ولی همان طور که گفتم این مشکل موقع ریختن در یک متغیر string پیش می آید!

ghabil
شنبه 23 تیر 1386, 13:14 عصر
توی این متن فارسی هست که تنظیمات فارسی رو درست کنند ؟!

راهی که من بنظرم میرسه اینه که خودت حروفی رو که در کدپیجتت نیستند رو شناسایی کنی معادلشون رو بیاری چون String که یونیکد نیست و حتما باید اون کرکتر که توی کدپیجت نیست با یک معادل جایگزین بشه ، واسه همین بهتره مقدار رو توی یک WideString بریزی بعد خودت تبدیلش کنی به استرینگ.

farnaz2003
شنبه 23 تیر 1386, 13:43 عصر
نمی دونم شما منظور منو متوجه نمی شید یا من منظور شما رو
اگه معادل بگذارم چون باز تو استرینگه به همون شکل علامت سوال نشون می ده
مشکلش با استرینگه
من انواعی مثل:
widestring utf8string و .... را امتحان کردم ولی باز هم این کاراکترها را علامت سوال می یاره

mehdi_mohamadi
شنبه 23 تیر 1386, 14:20 عصر
اگه میتونید آی دی زیر را اد کنید تا یه فایل واستون بفرستم نصب کنید
احتمالا" مشکلتون حل می شه
چو ن حجمش زیاده نمی تونم تو سایت آپلود کنم
موفق باشید
mehdi_mohamadi59@yahoo. com

ealvandi
شنبه 23 تیر 1386, 19:21 عصر
در قسمت فونت کنترلت خاصیتی است (دقیقا یادم نیست) که برای نمایش حروف فارسی باید مقدار arabic داشته باشد که احتمالا مقداری مثل western رو داره - اون رو arabic کن.

Batman
شنبه 23 تیر 1386, 19:54 عصر
همون طوری که دوست خوبمون آقای ealvandi اشاره کردن قسمت زیر رو دنبال کن شاید مشکلت حل شد
font-->charset-->arabic_charset

farnaz2003
دوشنبه 25 تیر 1386, 07:48 صبح
ممنون از راهنمایی های همه ولی اگه به بالا دقت کنید می بینید که اصلا متن من فارسی نیست
اگه کسی می خواد کمک کنه لطفا یک رشته تعریف کنه
var s:string
بعد رشته S را مقدار دهی کنه ' s:='Mr. Sayyid `Abbās Sadr-`āmelī
بعد هم با کلید F7 که Trace کنه می بینه که موقع ریخته شدن این مقدار در رشته S مقدارش بصورت زیر تغییر می کنه
Mr. Sayyid `Abb?s Sadr-`?mel?
(همون طور که می بینید متن فارسی نیست)
یعنی اینکه کاراکترهای خاص از جمله:ī و āو مشابه آنها بصورت ؟ می آید

امیدوارم الان متوجه منظورم شده باشید

Batman
دوشنبه 25 تیر 1386, 07:58 صبح
من تستش کردم و هیچ مشکلی نبود
ممکنه برنتمتون رو آپلود کنید تا ببینم مشکل فقط رو سیستم شما هستش یا در بقیه سیستم ها هم به همین شکل هستش

farnaz2003
دوشنبه 25 تیر 1386, 08:54 صبح
اینم برنامه نمونه

Batman
دوشنبه 25 تیر 1386, 19:42 عصر
من برنامتون رو نگاه کردم
دوست عزیز شما برای اون کاراکترها از Character Map استفاده کردید؟

farnaz2003
شنبه 30 تیر 1386, 12:59 عصر
هیچ کسی نیست سوال من را جواب بده؟
به جای String از WideString هم استفاده کردم جواب نداد.

saeed_rezaee
شنبه 30 تیر 1386, 21:05 عصر
سلام.
با WideString که مشکلی نداره!
فقط شما از TextBox استاندارد دلفی استفاده نکنید.
فکر کنم از TntUnicode Controls استفاده کنید مشکل حل بشه!

ghabil
یک شنبه 31 تیر 1386, 00:19 صبح
ببین بعضی از حروفی که توی این استفاده کردی مثل ā توی Charset فارسی و حتی اینگیلیسی نیستند ، دلیل اینکه اینجا توی وب دیده میشند اینه که اینجا محیط یونیکد هست ، اما محیط دلفی یونیکد نیست پس فقط میتونه حروفی رو که توی کرکترست پیش فرض سیستم هست رو نشون یده . که چون این حروف توش نیستند ، علامت سوال نشونشون میده ، حالا شما یا باید بیخیال این کلمات بشید و تبدیلشون کنید به معادلهاییشون که توی Charset Default سیستم هست ، یا اینکه کرست سیستم رو بزارید روی یک زبانی که این کرکترها رو داره مثلا آلمانی (اگر داشته باشه) ، یا اینکه همونطوری که یکی اینجا پیشنهاد کرده از اینترفیسهای یونیکدی که برای دلفی هست مثل TNT استفاده کنید که در این حالت هم باید حواستون باشه این وسط اطلاعات رو دوباره توی استرینگ نریزید که خراب میشند.

پ.ن : Charset Default سیستم برای برنامه هایی که یونیکد ساپورت نیستند در RegionalSettings، تب Advanced اونجایی که نوشته Language For none Unicode Programs تعیین میشه .

پ.ن : امیدوارم دوستان به جای حدس زدن های روی هوا سعی کنند مشکلات رو بفهمند و راه حل درستشون رو پیدا کنند.

Batman
یک شنبه 31 تیر 1386, 07:20 صبح
پ.ن : امیدوارم دوستان به جای حدس زدن های روی هوا سعی کنند مشکلات رو بفهمند و راه حل درستشون رو پیدا کنند.[/quote]
با عرض معذرت از آقای ghabil عزیز
من گفتم شاید از کاراکترهای charactermap استفاده کرده چون بعضی از اونها زمانی که توی دلفی میاری به صورت علامت ؟ در میاد
بهر حال شما چند تا پیرهن بیشتر از ماها پاره کردی و ما میخواهیم از تجربیات شما استفاده کنیم

Hadizadeh
یک شنبه 31 تیر 1386, 12:57 عصر
فونت رو Tahoma کن درست میشه!

Batman
یک شنبه 31 تیر 1386, 13:28 عصر
آقای هادیزاده این کاری رو که شما فرمودی جواب نداده
لطفا مطالب رو با دقت بخون
موفق باشی

Hadizadeh
یک شنبه 31 تیر 1386, 13:30 عصر
شرمنده ام به خدا ولی من قبلا چنین مشکلی داشتم این کارو کردم حل شد حالا ببخشید که وقت نکردم کل مطالب رو بخونم :-)

Shahryar_Bmp
دوشنبه 01 مرداد 1386, 22:17 عصر
سلام منم همچین مشکلی دارم و تکست های فارسیم رو Thai (تایوان) نمایش میده و من قبلا این مشکل رو نداشتم فکر کنم تنظیماته دلفی رو به هم ریختم و مشکلی از ویندوز نیست و مجبورم Thai رو به Arabic هر دفعه تعغیر بدم تا بتونم بنویسم

ghabil
دوشنبه 01 مرداد 1386, 23:33 عصر
[QUOTE=ghabil;368400]

پ.ن : Charset Default سیستم برای برنامه هایی که یونیکد ساپورت نیستند در RegionalSettings، تب Advanced اونجایی که نوشته Language For none Unicode Programs تعیین میشه .

[QOUTE]


اینو چک کردی؟

farnaz2003
سه شنبه 02 مرداد 1386, 16:32 عصر
من یه فایل Rtf را در یک RichEdit لود می کنم که این فایل دارای کاراکترهای خاص از جمله ā و ī و ... هست و مشکلی در نمایش آن در RichEdit وجود ندارد.
RichEdit1.Lines.LoadFromFile(filepath);


ولی وقتی که می خواهم یک خط از RichEdit را داخل یک متغییر WideString بریزم مشکل دار می آید
str:= RichEdit1.lines.Strings[1];


و دلیلش این است که lines.Strings یک مقدار String برمی گرداند نه Widestring و با اینکه خروجی اش را داخل Widestring می ریزیم چون خودش String برگردانده مشکل دار می شود.

سوال: آیا تابعی وجود دارد که خروجی RichEdit1.lines.Strings[1] را به Widestring تبدیل کند؟

با تشکر

علامت سوال
سه شنبه 02 مرداد 1386, 18:37 عصر
یه برنامه جدید ایجاد کنید
یک Memo و یک RichEdit روی فرم قرار بدید برنامه رو ران کنید
در زمان اجرا جمله زیر رو در اون Paste کنید ببینید چه اتفاقی میفته
Mr. Sayyid `Abbās Sadr-`āmelī
اتفاق اینه که در RichEdit همین عبارت ولی در Memo عبارت همره با ؟ نمایش در میاد.
این در حالیه که نوع Lines در هر دو کنترل TStrings هست
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:متفکر::متف ر::متفکر:

ghabil
چهارشنبه 03 مرداد 1386, 00:18 صبح
این در حالیه که نوع Lines در هر دو کنترل TStrings هست
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:متفکر::متف ر::متفکر:

دقیقا نکته همینجاست ! اگر دقت کنی RichEdit در تب Windows هست ، یعنی ماله VCL دلفی نیست یکی از کامپونتهای ویندوزه ، پس از ویندوز 2000 به بعد یونیکد ساپورت هست ، اما وقتی دلفی مقدارش رو از ویندوز میگیره تبدیلش میکنه به استرینگ 1 بایتی.
این نکته ای بود که من هم بهش دقت نکرده بودم ....

پس :




[COLOR=black]سوال: آیا تابعی وجود دارد که خروجی RichEdit1.lines.Strings[1] را به Widestring تبدیل کند؟

با تشکر

ببین با این تابع باید بتونی مقادیر رو مستقیما از ویندوز بگیری (بدون دخالت دلفی) ولی بعدش دوباره توی دلفی هر کاری باهاش بکنی میشه String ها :



function TForm1.RicheditWideLine(ARichEdit: TRichEdit; ALine: Integer ): WideString;
var
ALineIndex, ALineLength, I: Integer;
AHandle: HWND;
begin
Result := '';
AHandle := ARichEdit.Handle;
ALineIndex := SendMessageW(AHandle, EM_LINEINDEX, ALine, 0);
if ALineIndex >= 0 then
begin
ALineLength := SendMessageW(AHandle, EM_LINELENGTH, ALineIndex, 0);
if ALineLength > 0 then
begin
SetLength(Result, ALineLength);
Result[1] := Widechar(ALineLength);
I:= SendMessageW(AHandle, EM_GETLINE, ALine, LPARAM(PWideChar(Result)));
if I < ALineLength then
SetLength(Result, I);
end;
end;
end;


این کد یک خط رو میگیره دیگه ، میتونی یک لوپ بزنی همه خطهارو بگیری...

farnaz2003
چهارشنبه 03 مرداد 1386, 08:01 صبح
ممنون آقای ghabil هر چند ظاهر تابع خیلی درسته، و درست هم کار می کنه ولی با این تابع هم درست نشد و باز هم خروجی به جای اون کاراکترها ؟ داد.
اگه راه حل دیگه ای هر کسی داره بگه ممنون می شم.

ghabil
چهارشنبه 03 مرداد 1386, 08:53 صبح
کجا دیدی مقدار رو ؟

farnaz2003
چهارشنبه 03 مرداد 1386, 09:05 صبح
خروجی تابع را توی متغییر WideString ریختم.
چطور مگه؟ اشتباه کردم؟

علامت سوال
چهارشنبه 03 مرداد 1386, 09:42 صبح
منظور آقای کوشا این هست که مقدار رو ریختی توی WideString این درست ولی چطوری تونستی این مقدار رو در برنامه به نمایش بزاری و ببینی که متوجه شدی باز هم کار نمیکنه.

ghabil
چهارشنبه 03 مرداد 1386, 10:07 صبح
درسته چون محیط دلفی هم، حتی دیباگر کلا هیچ جایی یونیکد نیست ، فقط یا باید بنویسیش تو دیتابیس اونم با تمهیدات خاص یا توی فایل ذخیرش کنی بعد با یک محیطی که میتونه یونیکد نشون بده (مثلا نوت پد )ببینیش

farnaz2003
چهارشنبه 03 مرداد 1386, 11:01 صبح
نمی دونم منظورتون از اینکه کجا دیدید و اینا چیه ولی من با F7، خروجی را دیدم (Trace کردم) و دیدم علامت سوال می یاد.
(البته وقتی متغییر WideString بگیری و رشته را مستقیما توش بریزی و با F7 ببینی اوکی هستش
var s:Widestring
s:='Mr. Sayyid `Abbās Sadr-`āmelī

ولی همونطور که قبلا گفتم مشکلم اینه که
وقتی که می خواهم یک خط از RichEdit را داخل یک متغییر WideString بریزم مشکل دار می آید str:= RichEdit1.lines.Strings[1];



و دلیلش این است که lines.Strings یک مقدار String برمی گرداند نه Widestring و با اینکه خروجی اش را داخل Widestring می ریزیم چون خودش String برگردانده مشکل دار می شود.


و تابعی که شما دادید را خروجی اش را توی متغییر WideString ریختم و موقع اجرا با F7 دیدم که توش ؟ می ریزه

ممنون از همه (امیدوارم این دفعه تونسته باشم مفهوم را برسونم)

ghabil
چهارشنبه 03 مرداد 1386, 13:08 عصر
خب توی F7 یک EDIT و یک MEMO دلفی هست که اونا خودشون نمیتونند کد یونیکد رو نشون بدهند دیگه ، وقتی میگم محیط دیباگ هم یونکد نیست منظورم همینه دیگه.
تو بگو میخوای با این اطلاعات وقتی گرفتیشون چی کار بکنی؟

farnaz2003
چهارشنبه 03 مرداد 1386, 14:36 عصر
می خوام توی جدول بریزم.
توضیح بیشتر:
می خوام توی یه فیلد از جدول (در اکسس) بریزم، نوع فیلدش Memo است و در ضمن امتحان کردم و وقتی مستقیما در اکسس این رشته را توی فیلد می ریزیم مشکل نیست ولی وقتی از طریق کد نویسی توی دلفی است، مشکل دار می شه.
str:=R_temp.lines.Strings[StrToInt(ListBox1.Items.Strings[i])];
ADOTable1.FieldValues['txt']:=str;

farnaz2003
چهارشنبه 03 مرداد 1386, 14:51 عصر
یه چیز دیگه که حالا امتحان کردم (با فرض نادیده گرفتن Richedit) اینه که حتی اگه مستقیما رشته را توی WideString بریزیم
var str:widestring
str:='Mr. Sayyid `Abbās Sadr-`āmelī
تا اینجا درست در Str ریخته می شه ولی موقعی که توی جدول می ریزیم مشکل دار می شه
ADOTable1.FieldValues['txt']:=str

دیگه اینجا را تست نکرده بودم

اشکالات:
1- چطوری خروجی RichEdit1.lines.Strings[1 را به Widestring تبدیل کنم؟
2- بعد که از Richedit به درستی توی متغییر Widestring ریخته شد چطوری وقتی توی جدول می ریزم( ADOTable1.FieldValues['txt']:=str)درست وارد جدول بشه؟

علامت سوال
چهارشنبه 03 مرداد 1386, 15:27 عصر
نوع فیلد رو چی گذاشتی .؟
توی دیتابیس از nchar استفاده کن البته این برای SQLserver هست.
بعد ببین درست میشه

vcldeveloper
پنج شنبه 04 مرداد 1386, 09:27 صبح
قبلا یکی از دوستان اشاره کردند که از کنترل های Tnt استفاده کنید. این مجموعه کامپوننت از unicode پشتیبانی می کنه و بصورت open-source در دسترس هست. برای کار شما یک نمونه مثال از روی نمونه سورس کد خودتون با استفاده از Memo و TntMemo گذاشتم.
برای کامپایل مجدد نمونه سورس ضمیمه شده، باید Tnt روی دلفی نصب شده باشه.