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 都比较全一些
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。