Posted on 2012-01-14 16:16
在路上... 阅读(308)
评论(0) 编辑 收藏
碰到中文乱码的时候,可以考虑使用一个熟悉的中心字符串入手进行调试跟踪转换过程的变化,这里记录一下“中文”汉字的编码变化过程
UNICODE编码:4e2d 6587
通常在JAVA的内置处理机制中是这样存储的,不同的环境中返回的byte[]不一样,例如windows环境,使用getBytes()返回的是getBytes(“GBK”),linux环境,通常如果设置LANG=zh_CN.UTF-8,这相当于getBytes(“utf-8”).
GBK编码:d6d0 cec4,byte[]={-42,-48,-50,-60}
UTF8编码:e4 b8 ad e6 96 87,byte[]={-28,-72,-83,-26,-106,-121}
ISO8859-1编码:如果试图将byte[]={-42,-48,-50,-60}采用new String(byte[],”iso8859-1”)读取,由于不能正确转换,所以是2个问号byte[]={63,63}
但是从存储的角度看,gbk和iso8859-1有类似之处,GBK采用char(2),而iso8859-1采用byte[4],拆分为{-42,-48,-50,-60}
Javascript:可以使用var str=”\u4E2D\u6587”;来表示
HTML中,可以使用中文,相当于吧16进制转换为10进制,再加上转义控制&#和;结尾。
如果需要从utf byte[]和GBK byte[]之间互相转换,在支持unicode的java平台,可以使用下面的转换规则
byte[] utf8={-28,-72,-83,-26,-106,-121};
String str=new String(utf8,”utf-8”);//转换为正确的中文
byte[] gbk=str.getBytes(“GBK”);
或者:
byte[] gbk={-42,-48,-50,-60};
String str=new String(utf8,"GBK");//转换为正确的中文
byte[] utf8=str.getBytes("utf-8")
注意上面的byte[]为java的,与.net不一样,需要转换