- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在访问 utf8 字符集的网站时遇到问题,例如当我尝试访问此 www 时
所有 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 中我发现始终错误的字符,例如“名称”的正确值是
"name": "Aire d'adhésion du Parc national du Mercantour",
但是在获取指令之后我有
"name": "Aire d'adhésion du Parc national du Mercantour",
你知道我的错误在哪里吗?谢谢大家!
最佳答案
在包括 XE6 的 Delphi 2009+ 中,string
是 UTF-16 编码的 UnicodeString
。
您正在使用返回字符串
的TIdHTTP.Get()
的重载版本。它使用响应报告的任何字符集将发送的文本解码为 UTF-16。如果文本未正确解码,则可能意味着响应未报告正确的字符集。如果使用错误的字符集,文本将无法正确解码。
实际上,有问题的 URL 是发送一个设置为 application/json
的响应 Content-Type
header ,而不指定 charset
> 完全没有。 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;
您可以使用 TIdHTTP.Get()
的其他重载版本来填充输出 TStream
,而不是返回 字符串
。使用 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;
关于德尔福 & 印地 & utf8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52800270/
使用下面的代码,我能够得到正确的答案,但是它重复了 两次 . 例如,我只想要 [1.2038, 1.206] 的结果,但下面的代码打印 [1.2038, 1.206, 1.2038, 1.206] .
我正在尝试显示我从 https://www.findomestic.it/ 中抓取 的结果, 我收到一个错误 我的代码在这里: from selenium.webdriver.common.by im
假设我有以下代码: double median = med(10.0, 12.0, 3.0); //method returns middle number as double 现在,我想写一条消息说
我是一名优秀的程序员,十分优秀!