# Native Code > برنامه نویسی در Delphi > توسعه نرم افزار تحت وب >  مشکل با utf8 و ansi

## mossaferin

سلام

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

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

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

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

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

----------


## vcldeveloper

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

----------


## mossaferin

> شما باید داده برگشتی در Stream رو به یک WideString اختصاص بدید


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

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

----------


## vcldeveloper

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


داده ایی که IdHttp از سایت گرفته خودش UTF-8 هست، دیگه استفاده از AnsiToUtf8 برای چیه؟! شما داده UTF-8 دارید، به یک نوع داده نیاز دارید که داده یونیکد رو براتون نگه داره، و یک کنترل که این داده یونیکد رو براتون نمایش بده. شاید بتونید Stream برگشتی رو مستقیما از طریق TntMemo.Lines.LoadFromStream در TntMemo لود کنید.

----------


## mossaferin

> داده ایی که IdHttp از سایت گرفته خودش UTF-8 هست


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

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

----------


## Maya12

سلام
من متاسفانه عکس این مشکل رو دارم یعنی از دلفی میخوام پارامتر به سرور بفرستم،سمت سرورساید نوشته شده و سرور دو پارامتر ورودی رو میخونه و اونها رو در یک فایل تکست مینویسه
تا وقتی پارامتر انگلیسی هست همه چی درست کار میکنه ولی وقتی پارامتر فارسی میشه،به جای اونا روی فایل تکستی که سرور درست میکنه علامت سوال دیده میشه
کد من اینه
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

سلام

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

موفق باشی

----------


## Borland.C

> حق با شما بود 
>    من برای داده دریافتی از 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

سلام
تا اونجایی که ذهنم یاری می کنه این یک باگ در یکی از ورژن های IntraWeb بود که بعداً رفع شد و با آپدیت کردن آن این مشکل حل می شود. 
فکر می کنم که قبلاً هم در همین مورد در سایت توضیح داده بودم.
موفق باشید...

----------


## Borland.C

> سلام
> تا اونجایی که ذهنم یاری می کنه این یک باگ در یکی از ورژن های IntraWeb بود که بعداً رفع شد و با آپدیت کردن آن این مشکل حل می شود. 
> فکر می کنم که قبلاً هم در همین مورد در سایت توضیح داده بودم.
> موفق باشید...


 یعنی XE2 هم هنوز کمه؟!! :(

----------


## BORHAN TEC

> یعنی XE2 هم هنوز کمه؟!! :(


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

----------


## Borland.C

بحث رو IdHTTP هستش که یک کامپوننت indy ا
باز هم مسله به IntraWeb مربوط میشه؟
برنامه هم مربوط به ویندوزه برنامه تحت وب نیس
اینا رو گفتم که بهتر بتونین راهنمایی کنین

----------


## mohsen24000

احتمال زیاد مشکل شما از هدر است.

----------


## Borland.C

> احتمال زیاد مشکل شما از هدر است.


 میشه بیشتر توضیح بدید؟

----------


## vcldeveloper

> میشه بگید این مشکل در C++‎‎ builder XE2 به چه صورت قابل حله؟


باید ببینید Encoding داده دریافتی از سرور چی هست؟ Encoding در Header پاسخ HTTP برای شما ارسال میشه. اگر Encoding به صورت UTF8 بود، از Utf8String برای نگهداری از اون استفاده کنید. اگر یونیکد UTF16 بود، از string معمولی برای نگهداری اش استفاده کنید. اگر هم ANSI بود، اون وقت می تونید بر اساس CodePage ایی که براش مشخص شده، اون رو به UTF8 یا UTF16 تبدیل کنید و بعد نمایش اش بدید.

----------


## Borland.C

> باید ببینید Encoding داده دریافتی از سرور چی هست؟ Encoding در Header پاسخ HTTP برای شما ارسال میشه. اگر Encoding به صورت UTF8 بود، از Utf8String برای نگهداری از اون استفاده کنید. اگر یونیکد UTF16 بود، از string معمولی برای نگهداری اش استفاده کنید. اگر هم ANSI بود، اون وقت می تونید بر اساس CodePage ایی که براش مشخص شده، اون رو به UTF8 یا UTF16 تبدیل کنید و بعد نمایش اش بدید.


 خیلی ممنونم از توضیحاتتون،نوع داده های ارسالی سرور UTF-8 هست.اما Cpp B انگاری Utf8String نداره!خطا میگیره.میشه کمی بیشتر راهنمایی کنید؟

----------


## Borland.C

استاد شرمنده،اشکال از تایپ بنده بود وگرنه UTF8String هیچ مشکلی نداشت!!
فقط متاسفانه بازهم درست نشد
داده ها تو مزیلا و IE درست نمایش داده میشن اما تو برنامه به شکل خط قرون وسطی در میان

----------


## Borland.C

Untitled.png
این شکلی میشه!!!!

----------


## Borland.C

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


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

----------


## BORHAN TEC

به احتمال زیاد با خواندن این صفحه مشکلتان حل خواهد شد:
http://stackoverflow.com/questions/1...ng-into-string

----------


## Borland.C

حل نشد :گریه: 
دیگه واااااقعا کلافه شدم  :خیلی عصبانی:  هر کار می کنم نمیشه
بذار 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

همین کدت رو با یه آدرس دیگه چک کن ببین باز هم همین مشکل وجود داره!

----------


## Borland.C

> همین کدت رو با یه آدرس دیگه چک کن ببین باز هم همین مشکل وجود داره!


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

----------


## BORHAN TEC

و اما جواب نهایی(البته در دلفی و نسخه های جدیدتر از 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

مشکل حل شد بالاخره  :خجالت: 
اول از همه جا داره از استاد عزیز آقای کشاورز بابت راهنماییشون تشکر کنم و از دوست محترم آقای عشایری که حکم استاد بنده رو دارن نیز بابت زحمات و وقتی که در اختیار بنده گذاشتن نهایت قدردانی انجام بدم
اینم راه حل ساده اما راه خیلی که خیلی وقتم روگرفت
درواقع معادل سازی جواب آقای عشایری در 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;
}

----------

