在开发过程中,我们会遇到UTF-8跟GBK互转的时候,当中文字符为偶数时一般没有问题,但为奇数时互转之后最后一个字会出现乱码,为此,我们来看下到底是为什么。

单元测试类如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Test
public void test2() throws UnsupportedEncodingException{
String s = "中国字";
s=new String(s.getBytes(),"UTF-8");
System.out.println("UTF8:"+s);
print(s.getBytes("UTF-8"));
s=new String(s.getBytes("UTF-8"),"GBK");
System.out.println("GBK:"+s);
//GBK编码是偶数位编码,当为奇数时,最后一位标为不识别使用符号?代替对应ASCII代码就是63
print(s.getBytes("GBK"));
s=new String(s.getBytes("GBK"),"UTF-8");
System.out.println("UTF8:"+s);
print(s.getBytes("UTF-8"));
}
public void print(byte[] bs){
for(byte b:bs){
System.out.print(b+" ");
}
System.out.println("\n");
}

打印如下:
image

结论

就像测试类注释里写的GBK编码是偶数位编码,当byte数组为奇数时的UTF-8转成GBK时,最后一位标为不识别使用符号?代替对应ASCII代码就是63,再转回UTF-8时就会出现最后一位是乱码了。