几种字符乱码



其他编码转成iso8859-1出现乱码?(问号):

原因:是因为iso8859-*的处理逻辑,对不存在的的码值直接解析为?号(0x3F)
演示:


// 控制台设置为iso8859-1,输出一个左手图标"?",控制台显示乱码 System.out.println('\u261c');

解决:
处理好不同编码,iso是西欧用的比较多的编码,如果只是一个地区可以用gbk,建议把最基本编码方式设置为utf-*或者unicode形式,这样兼容性更好些



unicode编码字符输出显示方括号,或者方框中带一个16进制的值:
原因:缺少字体,我们平时在输入一个编码时其实是输入内码,或者称之为区位码,显示的字符是通过区位码找到对应的具体字符点阵信息,该信息才是显示的图形符号的具体信息,现在操作系统用字符库记录字符点阵信息(如:24X24,32X32)。unicode由于定义了大量的字符区位码,但是没有提供对应的字符点阵,所以各个系统上不一定有对应的点阵信息,当然官方提供了一个字符库,但是里面不能显示所有的字符,有些解析成显示方框加16进制值,大部分系统中会显示成一个方框
演示代码:
// 控制台设置为utf-8,显示"ÓB8; ",由于我的系统中不存在这个字符,因此无法正确显示该字符 System.out.println(Character.toChars(0x211B8));



解决:
添加字体,把生僻字库加入即可




GBK编码转成utf-8编码出现“??”种方式的乱码
原因:GBK和UTF-8互转是不对称的,即统一个GBK转成的UTF-8后的值转回来不一定是相同的GBK(会添加0x00)
演示:

// 控制台设置为UTF-8, 用GBK的byte序列去安unicode方式解析 System.out.println(new String("中国".getBytes("GBK")));

解决:
gbk和utf-8转码需要根据utf-8编码方式进行代码编写,可以网上找下,也可以自己根据规则写,但是不能直接转。同样gbk奇数位的转码也是有问题的,自己思考下编码方式就可知道




常规编码显示出错:
原因:主要是由于不同编码转换没出处理好导致,编码只要做到对称转换基本能解决这个问题
解决:选择正确的编码,如果不知道原先是何种编码,可以采用jchardet(jchardet是mozilla自动字符集探测算法代码的java移植)的编码试探方式找出具体编码。

【几种字符乱码】



显示unicode中编码值大于16位的字符:

System.out.println(Character.toChars(0x211B8)); // 不能通过System.out.println("\u0x211B8"); // 也不能通过赋值给char数组输出












    推荐阅读