我正在编写一个Delphi 7程序,以使用Indy 10 TIdHTTP
客户端和lkJSON解析器从TMDB网站提取数据。
对于ANSI类型的数据可以正常使用,但是带有欧洲重音符号的数据显示为“?”。
输出是一个HTML页面,所以我希望只保留UTF-8字段不变。我可能首先遇到s:=Idhttp1.get(URL)
失败的情况,其中s
是string
类型。 IDE会在文本中显示?
,但本身不会出现问题。
如何保留或重新创建UTF-8字符串以传递到输出?
答案 0 :(得分:1)
?
是将Unicode字符编码为不支持字符集的字符集。
您正在调用TIdHTTP.Get()
的重载版本,它返回一个String
。由于您使用的是Delphi的Unicode以前版本,String
是AnsiString
的别名,因此TIdHTTP
将
接收原始网站数据
使用服务器报告的字符集将其解码为Unicode(如果服务器未报告一个字符集,则为默认字符集)
将该Unicode数据重新编码为ANSI,以放入返回的AnsiString
中。
TIdHTTP.Response.Charset
退出时,TIdHTTP.Get()
属性设置为什么?确保它报告的是UTF-8,否则在解码为Unicode的过程中会丢失数据。
如果该步骤正常,则Indy的默认ANSI编码默认为US-ASCII,这意味着Unicode将重新编码为ASCII,这将丢失所有非ASCII字符。您可以使用ADestEncoding
的可选TIdHTTP.Get()
参数来覆盖它,例如:
s := Idhttp1.Get(URL, IndyTextEncoding_UTF8);
// s will always be UTF-8, even if the
// original data was not UTF-8...
...
或者,TIdHTTP.Get()
的重载需要写入TStream
而不是返回String
。它将完全按照服务器发送的方式输出原始HTML数据,例如:
strm := TMemoryStream.Create;
try
Idhttp1.Get(URL, strm);
// use raw strm data as needed...
finally
strm.Free;
end;