新建3个txt文件,内容分别为联通、联想、联,再次分别打开三个文件,会发现联通、联乱码,联想没有乱码。诡异!
package com.imooc.io;
import java.io.UnsupportedEncodingException;
public class EncodeDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "李程lch";
byte[] bytes1 = str.getBytes(); // 转换成字节序列用的是项目默认的编码utf-8
for (byte b : bytes1) {
// 把字节(转换成了int)以16进制的方式显示
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
// 结论:utf-8编码中文占用3个字节,英文占用1个字节
System.out.println();
byte[] bytes2 = str.getBytes("gbk"); // 转换成字节序列将编码设置为gbk
for (byte b : bytes2) {
// 把字节(转换成了int)以16进制的方式显示
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
// 结论:gbk编码中文占用2个字节,英文占用1个字节
System.out.println();
// java是双字节编码utf-16be
byte[] bytes3 = str.getBytes("utf-16be"); // 转换成字节序列将编码设置为utf-16be
for (byte b : bytes3) {
// 把字节(转换成了int)以16进制的方式显示
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
// 结论:utf-16be编码中文和英文君占用2个字节
System.out.println();
/*
* 当你的字节序列式某种编码时,这个时候想把字节序列变成字符串,也需要用这种编码方式,否则会出现乱码
*/
String str1 = new String(bytes3); // 用项目默认编码utf-8
System.out.println(str1); // 乱码
String str2 = new String(bytes3,"utf-16be"); // 使用序列化时的编码
System.out.println(str2); // 正常
String str3 = new String(bytes3,"gbk"); // 使用序列化时的编码
System.out.println(str3); // 乱码
/*
* 文本文件 就是字节序列
* 可以使任意编码
* 如果我们在中文机器上直接创建文本文件,那么该文本文件只认识ansi编码
* 联通、联这是一种巧合,他们正好符合了utf-8编码的规则。
*/
}
}
运行结果: