前言
中文乱码问题在我们日常开发中司空见惯,那么乱码问题是如何产生的呢?又怎样去解决乱码问题呢?本文将结合基本概念和例子展开阐述,希望大家有收获。
一个简单乱码的例子
package whx;
import java.io.UnsupportedEncodingException;
public class TestEncodeAndDecode {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "测试中文乱码";
byte[] b = str.getBytes("GBK");
System.out.println(new String (b,"UTF-8"));
}
}
复制代码
用GBK编码,用utf-8解码,产生乱码,运行结果如下:
相关基础概念
要理解乱码的根源,需要先了解清楚位、字节、字符、字符集等相关概念。
位(bit)
位是计算机存储数据的最小单位,1或者0就表示1位,如10010010就表示8位的二进制数。
字节
字节是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。
1 B = 8 bit (1字节等于8位)
1 KB = 1024 B = 1024 字节
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
复制代码
字符
字符是指计算机中使用的字母、数字、字和符号,是数据结构中最小的数据存取单位。如a、A、B、b、大、+、*、%等都表示一个字符;
在 ASCII 编码中,一个英文字母字符存储需要1个字节。
在 GB 2312 编码或 GBK编码中,一个汉字字符存储需要2个字节。
在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。
在UTF-16编码中,一个英文