https://www.bilibili.com/video/BV1ct411n7oG?p=172
目录
编码:字符串-->字节
查看当前工程使用的编码:
UTF-8:一个中文字符占3个字节
getBytes方法默认使用工程的字符集:
public class Test {
public static void main(String[] args){
String msg = "中文字符";
//编码:字节数组
byte[] datas = msg.getBytes();
System.out.println(datas.length);
}
}
输出结果:
12
加个英文字符
public class Test {
public static void main(String[] args){
String msg = "中文字符a";
//编码:字节数组
byte[] datas = msg.getBytes();
System.out.println(datas.length);
}
}
输出结果:
13
使用其他字符集编码:
import java.io.UnsupportedEncodingException;
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException{
String msg = "中文字符";
byte[] datas = msg.getBytes("UTF-16LE");
System.out.println(datas.length);
msg = "a";
datas = msg.getBytes("UTF-16LE");
System.out.println(datas.length);
}
}
输出结果:
8
2
UTF-16LE是定长unicode字符(每一个字符都是2个字节)
GBK是中文字符占2个字节,英文字符占1个字节:
import java.io.UnsupportedEncodingException;
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String msg = "中文字符";
byte[] datas = msg.getBytes("GBK");
System.out.println(datas.length);
msg = "a";
datas = msg.getBytes("GBK");
System.out.println(datas.length);
}
}
输出结果:
8
1
解码:字节-->字符串
查看String类的API文档:
解码:
import java.io.UnsupportedEncodingException;
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String msg = "中文字符abc";
byte[] datas = msg.getBytes("UTF-8");
msg = new String(datas, 0, datas.length, "utf8");
System.out.println(msg);
}
}
输出结果:
中文字符abc
可以看到,msg被正确地还原了。
乱码问题:
1、字节数不够:
import java.io.UnsupportedEncodingException;
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String msg = "中文字符a";
byte[] datas = msg.getBytes("UTF-8");
msg = new String(datas, 0, datas.length-2, "utf8");
System.out.println(msg);
}
}
输出结果:
中文字�
a占一个字节,被减掉了,“符”占3个字节,但少了一个字节。
所以要这样就能正确地显示了:
import java.io.UnsupportedEncodingException;
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String msg = "中文字符a";
byte[] datas = msg.getBytes("UTF-8");
msg = new String(datas, 0, datas.length-1, "utf8");
System.out.println(msg);
}
}
输出结果:
中文字符
2、字符集不统一:
import java.io.UnsupportedEncodingException;
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String msg = "中文字符a";
byte[] datas = msg.getBytes("UTF-8");
msg = new String(datas, 0, datas.length, "gbk");
System.out.println(msg);
}
}
输出结果:
涓枃瀛楃a