PDA

View Full Version : مشکل با utf8 و ansi



mossaferin
یک شنبه 02 خرداد 1389, 17:14 عصر
سلام

من با استفاده از Tidhttp از یه سایت اطلاعاتی رو میگیرم ، که توش اطلاعات به صورت فارسی وجود داره و توی وب برازر با انکدینگ utf8 همه چیز درسته

وقتی اطلاعات رو با Tidhttp دریافت میکنم و توی یه ممو نشان میدم اطلاعات به هم ریخته است

از utf8string برای ذخیره فیلد مربوطه استفاده کردم ، نشد
از تابع ANSITOUTF8 برای تبدیل استفاده کردم ، تغییر کرد ولی فارسی نشد
اطلاعات رو توی TNTMEMO ریختم ، باز هم نشد
این رو هم بگم که تنظیمات ویندوزم فارسیه و دلفی 7
فونتش رو هم tahoma گذاشتم ( البته چیزهای دیگه رو هم امتحان کردم)

1- چکار باید انجام بدم ؟
2- توی Tidhttp جایی وجود داره که character encoding رو روی utf8 تنظیم کرد ؟

ممنون از راهنمایی دوستان

vcldeveloper
یک شنبه 02 خرداد 1389, 19:12 عصر
خودِ IdHttp در دلفی 7 با رشته های ANSI کار میکنه، نه UTF-8؛ ولی داده ایی که به عنوان جواب از سرور دریافت می کنید، به صورت Stream ذخیره شده، پس محتواش هنوز دست نخورده هست، و اطلاعاتش از بین نرفته. وقتی این داده رو در یک String ذخیره می کنید، همه چیز باطل میشه! شما باید داده برگشتی در Stream رو به یک WideString اختصاص بدید.

mossaferin
یک شنبه 02 خرداد 1389, 20:35 عصر
شما باید داده برگشتی در Stream رو به یک WideString اختصاص بدید


در حالتی که داده برگشتی رو به یه string یا widestring یا ansistring یا utf8string اختصاص میدم ، در شکل خروجی (با توجه به اینکه در دوحالت میبینمش قبل از تبدیل (با کمک ansitoutf8) و بعد از تبدیل )هیچ تغییری دیده نمیشه

نباید برای Idhttp هیچ تنظیمی انجام بشه؟

vcldeveloper
یک شنبه 02 خرداد 1389, 21:25 عصر
در حالتی که داده برگشتی رو به یه string یا widestring یا ansistring یا utf8string اختصاص میدم ، در شکل خروجی (با توجه به اینکه در دوحالت میبینمش قبل از تبدیل (با کمک ansitoutf8) و بعد از تبدیل )هیچ تغییری دیده نمیشهداده ایی که IdHttp از سایت گرفته خودش UTF-8 هست، دیگه استفاده از AnsiToUtf8 برای چیه؟! شما داده UTF-8 دارید، به یک نوع داده نیاز دارید که داده یونیکد رو براتون نگه داره، و یک کنترل که این داده یونیکد رو براتون نمایش بده. شاید بتونید Stream برگشتی رو مستقیما از طریق TntMemo.Lines.LoadFromStream در TntMemo لود کنید.

mossaferin
دوشنبه 03 خرداد 1389, 20:43 عصر
داده ایی که IdHttp از سایت گرفته خودش UTF-8 هست

حق با شما بود
من برای داده دریافتی از widestring ، و در نهایت از utf8decode برای نمایش نهایی استفاده کردم که درست شد.

ممنون از راهنمایی شما

Maya12
سه شنبه 13 مهر 1389, 18:31 عصر
سلام
من متاسفانه عکس این مشکل رو دارم یعنی از دلفی میخوام پارامتر به سرور بفرستم،سمت سرورساید نوشته شده و سرور دو پارامتر ورودی رو میخونه و اونها رو در یک فایل تکست مینویسه
تا وقتی پارامتر انگلیسی هست همه چی درست کار میکنه ولی وقتی پارامتر فارسی میشه،به جای اونا روی فایل تکستی که سرور درست میکنه علامت سوال دیده میشه
کد من اینه
try

Stream := TIdMultiPartFormDataStream.Create;
pos:=TStringStream.Create;
stream.AddFormField('name', 'farsi name');
stream.AddFormField('family', 'farsi family');
try

try

try

http:=TIdHTTP.Create(self);
HTTP.HandleRedirects := True;
HTTP.AllowCookies := True;

with http do
begin
Request.ContentType := 'application/x-www-form-urlencoded;';
Request.CharSet := 'utf-8';
Request.AcceptCharSet := 'utf-8';
Request.UserAgent := 'agent2';
Request.Connection := 'Keep-Alive';
Request.ProxyConnection := 'Keep-Alive';

Request.CacheControl := 'no-cache';

HTTP.post('http://site.com/order/index.php',stream ,pos);

end;
except
on E: Exception do
ShowMessage('Error happend during POST: ' + E.Message);
end;

mossaferin
چهارشنبه 14 مهر 1389, 11:31 صبح
سلام

من برای استفاده از مترجم گوگل از همین روش استفاده کردم و برای فرستادن متن به سرور از UTF8ENCODE

موفق باشی

Borland.C
پنج شنبه 21 دی 1391, 15:09 عصر
حق با شما بود
من برای داده دریافتی از widestring ، و در نهایت از utf8decode برای نمایش نهایی استفاده کردم که درست شد.

ممنون از راهنمایی شما
نخواستم 1پست جدید در تالار C ایجاد کنم این بود که همینجا پرسیدم.
میشه بگید این مشکل در c++ builder XE2 به چه صورت قابل حله؟
ویژگی های IdHTTP به صورت های زیر هم تنظیم کردم اما باز هم نشد!
AcceptCharset=UTF-8
Charset=UTF-8

WideString mRes;
mRes = myURL;
mRes = IdHTTP1->Get(mRes);
Panel1->Caption = mRes;

اما متن پنل همچنان به هم ریخته!!!!!

BORHAN TEC
پنج شنبه 21 دی 1391, 18:12 عصر
سلام
تا اونجایی که ذهنم یاری می کنه این یک باگ در یکی از ورژن های IntraWeb بود که بعداً رفع شد و با آپدیت کردن آن این مشکل حل می شود.
فکر می کنم که قبلاً هم در همین مورد در سایت توضیح داده بودم.
موفق باشید...

Borland.C
پنج شنبه 21 دی 1391, 21:32 عصر
سلام
تا اونجایی که ذهنم یاری می کنه این یک باگ در یکی از ورژن های IntraWeb بود که بعداً رفع شد و با آپدیت کردن آن این مشکل حل می شود.
فکر می کنم که قبلاً هم در همین مورد در سایت توضیح داده بودم.
موفق باشید...
یعنی XE2 هم هنوز کمه؟!! :(

BORHAN TEC
پنج شنبه 21 دی 1391, 21:59 عصر
یعنی XE2 هم هنوز کمه؟!! :(
منظورم این نیست. XE2 ورژنی برای دلفی است. IntraWeb یک محصول جدا است که نسخه ابتدایی آن به طور پیش فرض در دلفی قرار داده شده است. IntraWeb XII (یعنی نسخه 12 مربوط به IntraWeb) در این زمینه باگی داشت که در نسخه 12.2.9 این مشکل حل شد. که برای کسب اطلاعات بیشتر می توانید به آدرس زیر مراجعه کنید:
http://www.atozed.com/intraweb/history/XII/index.EN.aspx
در ضمن شما می توانید IntraWeb را Update کنید که روش انجام این کار در زیر شرح داده شده است:
http://stackoverflow.com/questions/8756134/update-intraweb-12-in-delphi-xe2

Borland.C
پنج شنبه 21 دی 1391, 22:27 عصر
بحث رو IdHTTP هستش که یک کامپوننت indy ا
باز هم مسله به IntraWeb مربوط میشه؟
برنامه هم مربوط به ویندوزه برنامه تحت وب نیس
اینا رو گفتم که بهتر بتونین راهنمایی کنین

mohsen24000
پنج شنبه 21 دی 1391, 23:39 عصر
احتمال زیاد مشکل شما از هدر است.

Borland.C
جمعه 22 دی 1391, 12:53 عصر
احتمال زیاد مشکل شما از هدر است.
میشه بیشتر توضیح بدید؟

vcldeveloper
جمعه 22 دی 1391, 13:41 عصر
میشه بگید این مشکل در C++‎ builder XE2 به چه صورت قابل حله؟
باید ببینید Encoding داده دریافتی از سرور چی هست؟ Encoding در Header پاسخ HTTP برای شما ارسال میشه. اگر Encoding به صورت UTF8 بود، از Utf8String برای نگهداری از اون استفاده کنید. اگر یونیکد UTF16 بود، از string معمولی برای نگهداری اش استفاده کنید. اگر هم ANSI بود، اون وقت می تونید بر اساس CodePage ایی که براش مشخص شده، اون رو به UTF8 یا UTF16 تبدیل کنید و بعد نمایش اش بدید.

Borland.C
جمعه 22 دی 1391, 19:13 عصر
باید ببینید Encoding داده دریافتی از سرور چی هست؟ Encoding در Header پاسخ HTTP برای شما ارسال میشه. اگر Encoding به صورت UTF8 بود، از Utf8String برای نگهداری از اون استفاده کنید. اگر یونیکد UTF16 بود، از string معمولی برای نگهداری اش استفاده کنید. اگر هم ANSI بود، اون وقت می تونید بر اساس CodePage ایی که براش مشخص شده، اون رو به UTF8 یا UTF16 تبدیل کنید و بعد نمایش اش بدید.
خیلی ممنونم از توضیحاتتون،نوع داده های ارسالی سرور UTF-8 هست.اما Cpp B انگاری Utf8String نداره!خطا میگیره.میشه کمی بیشتر راهنمایی کنید؟

Borland.C
جمعه 22 دی 1391, 20:14 عصر
استاد شرمنده،اشکال از تایپ بنده بود وگرنه UTF8String هیچ مشکلی نداشت!!
فقط متاسفانه بازهم درست نشد
داده ها تو مزیلا و IE درست نمایش داده میشن اما تو برنامه به شکل خط قرون وسطی در میان

Borland.C
جمعه 22 دی 1391, 21:01 عصر
98264
این شکلی میشه!!!!

Borland.C
جمعه 22 دی 1391, 21:44 عصر
حق با شما بود
من برای داده دریافتی از widestring ، و در نهایت از utf8decode برای نمایش نهایی استفاده کردم که درست شد.

ممنون از راهنمایی شما
منم همین کارو کردم اما مشکل همچنان پا برجاست :(

BORHAN TEC
شنبه 23 دی 1391, 13:15 عصر
به احتمال زیاد با خواندن این صفحه مشکلتان حل خواهد شد:
http://stackoverflow.com/questions/11291397/c-convert-unicodestring-into-string

Borland.C
شنبه 23 دی 1391, 16:25 عصر
حل نشد:گریه:
دیگه واااااقعا کلافه شدم :عصبانی++: هر کار می کنم نمیشه
بذار 1بار کامل بگم شاید...
من 1 IdHTTP دارم که با استفاده از تابع Get اون 1URL ارسال میکنم.سرور با گرفتن متغییرها و داده ها داخل URL پس از پردازش 1 رشته به عنوان جواب برمی گردونه که از نوع UTF-8 هست(اینو مطمئنم چون تابع سمت سرور هم خودم نوشتم و از اون گذشته وقتی URL رو در مرورگر میزنم همه چی درسته و Enc..=UTF-8 نشون میده)
اما مقدار برگشتی در برنامه بهم ریخته نشون داده میشه :گیج:

object IdHTTP1: TIdHTTP
AllowCookies = True
ProxyParams.BasicAuthentication = False
ProxyParams.ProxyPort = 0
Request.CharSet = 'UTF-8'
Request.ContentEncoding = 'UTF-8'
Request.ContentLength = -1
Request.ContentRangeEnd = -1
Request.ContentRangeStart = -1
Request.ContentRangeInstanceLength = -1
Request.Accept = 'text/html, */*'
Request.AcceptCharSet = 'UTF-8'
Request.BasicAuthentication = False
Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
Request.Ranges.Units = 'bytes'
Request.Ranges = <>
HTTPOptions = [hoForceEncodeParams]
Left = 40
Top = 112
end



UTF8String mRes;
mRes = IdHTTP1->Get(mURL);
Memo1->Text = mRes;

برنامه در Borland C++ BuilderXE2
OS : WIN.7

mohsen24000
شنبه 23 دی 1391, 17:00 عصر
همین کدت رو با یه آدرس دیگه چک کن ببین باز هم همین مشکل وجود داره!

Borland.C
شنبه 23 دی 1391, 17:13 عصر
همین کدت رو با یه آدرس دیگه چک کن ببین باز هم همین مشکل وجود داره!
تست کردم اما باز هم نشد
روی 2 سرور جداگانه هم تست کردم

BORHAN TEC
شنبه 23 دی 1391, 17:53 عصر
و اما جواب نهایی(البته در دلفی و نسخه های جدیدتر از 2009): :لبخند:
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
sm: TStream;
begin
sm := TMemoryStream.Create;
try
IdHTTP1.Get('http://www.YYY.com/Index.php', sm);
sm.Position := 0;
Memo1.Lines.LoadFromstream(sm, TEncoding.UTF8)
finally
sm.Free;
end;
end;

Borland.C
شنبه 23 دی 1391, 18:24 عصر
مشکل حل شد بالاخره :خجالت:
اول از همه جا داره از استاد عزیز آقای کشاورز بابت راهنماییشون تشکر کنم و از دوست محترم آقای عشایری که حکم استاد بنده رو دارن نیز بابت زحمات و وقتی که در اختیار بنده گذاشتن نهایت قدردانی انجام بدم
اینم راه حل ساده اما راه خیلی که خیلی وقتم روگرفت
درواقع معادل سازی جواب آقای عشایری در C++‎ Builder هستش

TMemoryStream *tmem=new TMemoryStream();
TEncoding *mte;
__try{
IdHTTP1->Get("YOUR URL",tmem);
tmem->Position = 0;
Memo1->Lines->LoadFromStream(tmem ,mte->UTF8);
}
__finally{
delete tmem;
}