打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ISO8859-1与GBK互转

String str = “ab我爱中国”;

1. 假设客户端使用GBK编码,{ byte[] bgbk = str.getBytes("GBK") };
2. 传输至server,服务器默认采用ISO-8859-1来解码,{ str2 = new String(bgbk,"ISO-8859-1")}
3. 产生乱码,因为GBK两个字节表示1个中文,ISO解码时,每个字节算一个ASCII字符,这样一共     输出了10个字符:ab?ò°??D1ú   非中文字符ab解析是正常的,其他字节都被认为特殊ascii
4. 纠正乱码,byte[] bios = str2.getBytes("ISO..-1"); new String(b,"GBK")

bgbk = [97,98,-50,-46,-80,-82,-42,-48,-71,-6] = bios;
big    = [97,98, 63, 63, -95,-29, 63,  63, 63, 63,-88,-78]

思考问题:
iso得到的字节数组 bios 和 bgbk是一致的, 只是解码方式不一致,所以尝试这样来解决乱码问题;前3步不变,第4步,byte[] big = str2.getBytes("GBK");new String(big,"GBK"),结果失败,为什么?

Java字符串是以char[]形式存储的,每个char的内存存储方式为utf16,getBytes,是自己根据需要,遍历char[],将每个char的utf16码转化为目标编码,例如gbk,iso,并转化为字节数组;

所以,字节数组一样,不代表char[]是一样的,str2的char[]为10个字符,当对他getBytes("GBK")解码时,ascii字符 a 和b正常,-50=\u00CE,在GBK中米有对应编码,所以返回\u003F = 63,
-80=\u00B0,在GBK中有对应编码 A11D,即-95 -29 ,所以-80到big时,对应了两个byte -95和-29,最后-6 也对应了两个 -88 和-78;GBK正常解码应该是6个字符

对big用GBK解码时,97 98 正常按ascii解析,两个63两个?,-95 -29 解析为°,如下所示:
ab??°????ú

PS:GB2312 收录字符较少,ASCII > 7f 的貌似都没收,GBK相对来说,汉字,ASCII 都比较全一些
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
java字符串的各种编码转换类ChangeCharset
java 字符编码处理
struts原理与实践(4)
正确理解UNICODE UTF
java乱码问题分析
Java IO流之中文乱码
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服