String name="思"; String sendName = new String(name.getBytes("UTF-8"),"GBK"); System.out.println(sendName); String recvName = new String(sendName.getBytes("GBK"),"UTF-8"); System.out.println(recvName); 各位 java 程序员,上段代码中的编码转换有什么问题吗?大部分 recvName 中大部分汉子都可以正常显示,但‘思’和‘怡’两个字乱码。
1
Fri 2018-04-05 21:04:25 +08:00
问题出在 UTF-8 编码后的“思{-26, -128, -99 }”字占用三个字节,而 GBK 编码是每两个字节转为一个字符,所以在用 GBK 编码{-26, -128, -99 }的时候,系统会用“ 0 ”补全缺少的第四个字节变为{-26, -128, -99, 0}以进行编码。
之后将{-26, -128, -99, 0}按 UTF-8 编码为字符串时,因为多了一个字节“ 0 ”,所以就无法映射到“思{-26, -128, -99 }’字了。 |
2
Fri 2018-04-05 21:44:42 +08:00
1# 抱歉.....重新思考了下发现上面的回复是❌的。
可以确认的是 UTF-8 是长度可变的一种编码方式,编码后会占用 1~4 个字节不等,GBK 编码后占用 2 个字节。 |