RSS订阅 | 匿名投稿
您的位置:网站首页 > JSON > 正文

Delphi中用IdHttp获取json数据乱码问题

作者:admin 来源: 日期:2013/11/24 22:30:15 人气: 标签:

最近捡起丢了10年的Delphi来玩,想试试对json的数据处理。
试了TSuperObject和TlkJSONobject,都发现拉回的数据是乱码,运行exe就报错。
测试发现获取的json源数据中间汉字的地方是乱码,导致引号不配对,引发内存错误。
后来找了文章,发现是TIdHttp在获取数据之前,要将定义的TStringStream的Encoding设置为UTF8,才可以。
 
贴一小段源码,看官一看就懂的:
var
  b: TStringStream;  //用于接收json数据的流
  s1: String;
begin
  b := TStringStream.Create('',65001);  //65001是UTF-8
  IdHTTP1.Get('http://www.weather.com.cn/data/cityinfo/101010100.html', b);  //获取中国气象局公开的json数据
  s1 := b.DataString;
  mmoJsonContent.Text := s1;  //展示原始数据
 
另,关于编码的定义,在System.SysUtils单元有定义:
function GetCPInfo(CodePage: Cardinal; var lpCPInfo: TCPInfo): Boolean;
begin
  Result := True;
  case CodePage of
    // Code page identifiers understood directly by iconv_open()
    154, 367, 437, 737, 775, 819, 850, 852,
    853, 855..858, 860..866, 869, 874, 922: lpCPInfo.MaxCharSize := 1;
    932, 936, 943, 949, 950: lpCPInfo.MaxCharSize := 2;
    1046, 1124, 1125, 1129, 1133, 1161, 1162, 1163, 1250..1258: lpCPInfo.MaxCharSize := 1;
    1361: lpCPInfo.MaxCharSize := 2;
    // Code page indentifiers translated to iconv_open() encoding names (by LocaleNameFromCodePage)
    10000, 10004..10007, 10010, 10017, 10021,
    10029, 10079, 10081, 10082: lpCPInfo.MaxCharSize := 1;        // MacRoman .. MacCroatian
    12000, 12001: lpCPInfo.MaxCharSize := 4;                      // UTF-32LE, UTF-32BE
    20127, 20866: lpCPInfo.MaxCharSize := 1;                      // ASCII, KOI8-R
    20932: lpCPInfo.MaxCharSize := 3;                             // EUC-JP
    20936: lpCPInfo.MaxCharSize := 2;                             // GB2312, EUC-KR
    21866, 28591..28601, 28603..28606: lpCPInfo.MaxCharSize := 1; // KOI8-U, ISO-8859-1..ISO-8859-16
    50221: lpCPInfo.MaxCharSize := 9;                             // ISO-2022-JP
    50225: lpCPInfo.MaxCharSize := 7;                             // ISO-2022-KR
    50227: lpCPInfo.MaxCharSize := 8;                             // ISO-2022-CN
    51932: lpCPInfo.MaxCharSize := 3;                             // EUC-JP
    51936, 51949: lpCPInfo.MaxCharSize := 2;                      // GB2312, EUC-KR
    51950, 52936, 54936: lpCPInfo.MaxCharSize := 4;               // EUC-TW, HZ-GB-2312, GB18030
    65000: lpCPInfo.MaxCharSize := 6;                             // UTF-7
    65001: lpCPInfo.MaxCharSize := 4;                             // UTF-8
  else
    Result := False;
  end;
end;

读完这篇文章后,您心情如何?
0
0
0
0
0
0
0
0
本文网址: