1.原因
中文s,gbk转utf-8会扩展字节,中文utf-8字节转gbk,最后一个字节格式不对,直接转为了?(63),再将带问号中文gbk转utf-8字节,最后一个字节就变成了63,输出utf-8的中文最后就乱码了。
清晰原文链接
其实:中文,只要getBytes和new String都是一样的编码,无论如何都不会乱码。而乱码的原因就是其中几种编码之间转换不识别,导致字节码发生了变化,字节码对应的中文就变了,就乱码了。
2.示例
借用网上的一个例子。VM options里面加-Dfile.encoding=GBK,模拟gbk的容器。
public static void main(String[] args) throws UnsupportedEncodingException {
String gbk = "我来了";
String utf8 = new String(gbk.getBytes("UTF-8")); //这里将utf-8的字节码,翻译为gbk的中文,最后一个字节翻译成了?(63),此时utf8.getBytes()或utf8.getBytes("UTF-8")与gbk.getBytes("UTF-8")得到的字节是不一样了
//模拟UTF-8编码的网站显示
System.out.println(new String(utf8.getBytes(),"UTF-8"));
}