大家好,今天我们一起来总结一下Java中的字符串编码问题、中文乱码是如何出现的、怎样预防中文乱码的出现。
我们磁盘上的装载文字的文件是由字节序列组成的,这种字节序列使用了某一种编码方式(常见的有ISO8859-1、GBK、UTF-8这些),相同的中文汉字在使用不同的编码方式的时候,占用的字节个数不一样,每个字节的大小也不一样。所以,我们在进行字符串String和字节数组byte[]之间转换的时候就要注意字节序列使用的是哪种编码。
来看看这个例子:
package com.bear.demo;
public class CharEncodeDemo {
public static void main(String[] args) throws Exception {
// 定义一个字符串,包含中文和英文
String s = "谦逊OK";
// 按照文件默认的编码转换成字节数组,本文件默认编码是GBK
byte[] b1 = s.getBytes();
printBytes(b1);// 结果发现中文占2个字节,英文占1个字节
// 按照UTF-8的编码转换成字节数组
byte[] b2 = s.getBytes("UTF-8");
printBytes(b2);// 结果发现中文占3个字节,英文占1个字节
// Java使用的编码是UTF-16BE,按照UTF-16BE编码转换成字节数组
byte[] b3 = s.getBytes("UTF-16BE");
printBytes(b3);// 结果发现中文占2个字节,英文占2个字节
// 当字节序列是特定的编码时,将其转换为字符串也必须使用这种特定的编码,否则就会出现乱码
String s1 = new String(b1, "GBK");
String s2 = new String(b2, "UTF-8");
String s3 = new String(b3, "UTF-16BE");
System.out.println(s1 + "\n" + s2 + "\n" + s3);
}
// 将字节数组按照从前到后的顺序以16进制数的形式循环打印出来
private static void printBytes(byte[] b) {
for (int i = 0; i < b.length; i++) {
//字节长度是8位,所以只保留后8位。toHexString()是显示整数int的16进制形式
System.out.print(Integer.toHexString(b[i] & 0xff) + "\t");
}
System.out.println();
System.out.println();
}
}