Delphi 7:处理从网站读取的JSON响应中的utf-8数据

时间:2019-12-14 13:07:58

标签: json http delphi utf-8

我正在编写一个Delphi 7程序,以使用Indy 10 TIdHTTP客户端和lkJSON解析器从TMDB网站提取数据。

对于ANSI类型的数据可以正常使用,但是带有欧洲重音符号的数据显示为“?”。

输出是一个HTML页面,所以我希望只保留UTF-8字段不变。我可能首先遇到s:=Idhttp1.get(URL)失败的情况,其中sstring类型。 IDE会在文本中显示?,但本身不会出现问题。

如何保留或重新创建UTF-8字符串以传递到输出?

1 个答案:

答案 0 :(得分:1)

?是将Unicode字符编码为不支持字符集的字符集。

您正在调用TIdHTTP.Get()的重载版本,它返回一个String。由于您使用的是Delphi的Unicode以前版本,StringAnsiString的别名,因此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;