java的内核是Unicode的,也就是说,在程序处理字符时是用Unicode来表示字符的,但是文件和流的保存方式是使用字节流的。在java的基本数据类型中,char是Unicode的,而byte是字节,因此,在不同的环节java要对字节流和char进行转换。这种转换发生时如果字符集的编码选择不当,就会出现乱码问题。 我们常见的乱码大致有如下几种情形: 1、汉字变成了问号"?" 2、有的汉字显示正确,有的则显示错误 3、显示乱码(有些是汉字但并不是你预期的) 4、读写数据库出现乱码 下面我们逐一对它们出现的原因做一些解释: 首先,我们讨论汉字变成问号的问题。 Java中byte与char相互转换的方法在sun.io包中。其中,byte到char的常用转换方法是: public static ByteToCharConverter getConverter(String encoding); 为了便于大家理解,我们先来做一个小实验:比如,汉字"你"的GBK编码为0xc4e3,其Unicode编码是\u4f60。我们的实验是这样的,先有一个页面比如名为a_gbk.jsp输入汉字"你",提交给页面b_gbk.jsp。在b_gbk.jsp文件中以某种编码方式得到"你"的字节数组,再将该数组以某种编码方式转换成char,如果得到的char值是0x4f60则转换是正确的。 a_gbk.jsp的代码如下: 参考文献: 参考文献: |