json源数据中间汉字的地方是乱码
来源:互联网 发布:网络婚礼 编辑:程序博客网 时间:2024/05/22 07:48
最近捡起丢了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;
试了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
- json源数据中间汉字的地方是乱码
- Android读取服务端TXT(JSON格式数据)返回汉字乱码的问题
- shtm(UTF-8)页面中post提交留言数据,aspx页面中间处理但获取的是乱码
- json数据汉字打印
- 不借助中间页面实现JSON数据的接收
- asp.net 中 js脚本输出的汉字是乱码
- myeclipse查询mysql出来的汉字是乱码
- Myeclipse 导入别人的项目,汉字是乱码怎么办?
- mysql插入汉字是乱码或者问号的解决方法
- 汉字乱码问题解决:添加数据的时候,添加汉字,添加成功了,但是显示乱码
- JSON数据的中文乱码问题
- 解决JSON数据的中文乱码问题
- 后台接收JSON数据乱码的解决方案
- JSON返回的数据中文乱码问题!!!
- JSON数据传递的中文乱码
- PLSQL汉字乱码的处理方法,DBMS_OUTPUT输出的中文是乱码
- php汉字转json格式不乱码
- 是地方的风格
- 第二章 Java基础之GJLIB动态代理
- 51nod1079 中国剩余定理
- 在单台VM中用Devstack部署OpenStack
- ScrollView里嵌套ListView的解决办法。
- [LeetCode][二叉树]Symmetric Tree
- json源数据中间汉字的地方是乱码
- 拍照后如何得到真实大小的图片
- Qt5 趣学(3):程序启动画面(广告小画面...)
- Abstract class VS Interface
- 科达飞讯语义识别报20021,引擎错误
- 关于proxy模式下,@Transactional标签在创建代理对象时的应用
- H.264中的P-Skip宏块和B-Skip宏块简介
- 用Java实现各种排序(2)---希尔排序
- HDU Buildings