Delphi&Indy&utf8

Delphi&Indy&utf8,第1张

概述我有一个问题,访问到网站whit utf8 charset,例如当我尝试在这个www的accesso Click for example 所有utf8字符都没有正确编纂. 这是我的访问例程: var Web : TIdHTTP; Sito : String; hIOHand : TIdSSLIOHandlerSocketOpenSSL;begin Url := T 我有一个问题,访问到网站whit utf8 charset,例如当我尝试在这个www的accesso

Click for example

所有utf8字符都没有正确编纂.
这是我的访问例程:

var  Web     : TIDhttp;  Sito    : String;  hIOHand : TIDSSliOHandlerSocketopenSSL;begin  Url := TIDURI.URLEncode(Url);  try    Web := TIDhttp.Create(nil);    hIOHand := TIDSSliOHandlerSocketopenSSL.Create(nil);    hIOHand.DefStringEnCoding := IndyTextEnCoding_UTF8;    hIOHand.SSLOptions.SSLVersions := [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2,sslvSSLv2,sslvSSLv3,sslvSSLv23];    Web.IOHandler := hIOHand;    Web.Request.CharSet := 'utf-8';    Web.Request.UserAgent := INET_USERAGENT;       //Custom user agent string    Web.RedirectMaximum := INET_REDIRECT_MAX;      //Maximum redirects    Web.HandleRedirects := INET_REDIRECT_MAX <> 0; //Handle redirects    Web.ReadTimeOut := INET_TIMEOUT_SECS * 1000;   //Read timeout msec    try      Sito := Web.Get(Url);      Web.disconnect;    except      on e : exception do        Sito := 'ERR: ' +Url+#32+e.Message;    end;  finally    Web.Free;    hIOHand.Free;  end;

我尝试了所有的解决方案,但在Sito var我发现错误的characthers,例如“名称”的正确值

“名称”:“A dd’adhésionduParc national du Mercantour”,

但在获得Get指令之后

“名称”:“Aire d’adhéithionParc national du Mercantour”,

你知道我的错误在哪里吗?
谢谢你们!

解决方法 在包含XE6的Delphi 2009中,string是UTF-16编码的UnicodeString.

您正在使用返回字符串的TIDhttp.Get()的重载版本.它使用响应报告的任何字符集将发送的文本解码为UTF-16.如果文本未正确解码,则可能意味着响应未报告正确的字符集.如果使用了错误的字符集,则文本将无法正确解码.

实际上,有问题的URL是发送一个响应Content-Type标头,该标头设置为application / Json而根本没有指定字符集. application / Json的默认字符集是UTF-8,但Indy不知道,所以它最终使用自己的内部默认值,而不是UTF-8.这就是当存在非ASCII字符时文本无法正确解码的原因.

在这种情况下,如果您知道字符集将始终为UTF-8,您可以选择以下几种解决方法:

>您可以通过在IDGlobal单元中设置全局GIDDefaultTextEnCoding变量,将Indy的默认字符集设置为UTF-8:

GIDDefaultTextEnCoding := encUTF8;

>如果它是空白或不正确,您可以使用TIDhttp.OnheadersAvailable事件将TIDhttp.Response.Charset属性更改为’utf-8′.

Web.OnheadersAvailable := CheckResponseCharset;...procedure TMyClass.CheckResponseCharset(Sender: TObject; Aheaders: TIDheaderList; var VContinue: Boolean);var  Response: TIDhttpResponse;begin  Response := TIDhttp(Sender).Response;  if IsheaderMediaType(Response.ContentType,'application/Json') and (Response.Charset = '') then    Response.Charset := 'utf-8';  VContinue := True;end;

>您可以使用填充输出TStream而不是返回字符串的TIDhttp.Get()的其他重载版本.使用TMemoryStream或TStringStream,您可以使用UTF-8自己解码原始字节:

MStrm := TMemoryStream.Create;try  Web.Get(Url,MStrm);  MStrm.position := 0;  Sito := ReadStringFromStream(MStrm,IndyTextEnCoding_UTF8);finally  sstrm.Free;end;
sstrm := TStringStream.Create('',TEnCoding.UTF8);try  Web.Get(Url,sstrm);  Sito := sstrm.DataString;finally  sstrm.Free;end;
总结

以上是内存溢出为你收集整理的Delphi&Indy&utf8全部内容,希望文章能够帮你解决Delphi&Indy&utf8所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1216448.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存