您的位置:首页 > 编程语言 > Java开发

【三分钟让你彻底明白Java字符串编码问题(图文)】

2017-05-05 14:54 323 查看
大家好,今天我们一起来总结一下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();
}

}


运行后的结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: