目录
一、计算机存储机制
二、字符集
(一)字符集概述
(二)各种常见字符集
1.ASCII
2.ISO-8859-1(Latin-1)
3.GB2312
4.BIG5
5.GBK
6.Unicode
三、编码格式
(一)编码格式概述
(二)常见编码格式
1.GB18030
2.Shift-JS
3.EUC-KR
4.UTF-8
5.UTF-16
6.UTF-32
四、区别总结
五、乱码问题
1.出现原因
2.解决方式
3.字节流读取中文时出现乱码,但在拷贝过程中却不乱码的原因
六、Java中编码和解码的方法
(一)编码
(二)解码
一、计算机存储机制
在计算机中,任意数据都是以二进制的形式来存储的,计算机中最小的存储单元是一个字节。
二、字符集
(一)字符集概述
定义:字符集是一种映射关系,它将字符与二进制数据之间进行转换。在计算机中,使用字符集来表示和存储文本数据。
功能:字符集定义了可以使用的字符范围,包括字母、数字、标点符号、特殊符号等。每种字符集都包含了一定数量的字符,这些字符在计算机内部以二进制形式存储和表示。
(二)各种常见字符集
1.ASCII
美国信息交换标准代码,包含128个字符。是计算机中最早使用的字符编码,它主要用于表示英文字符和一些特殊符号。ASCII码使用7位二进制数进行编码,首位为0。此外,还有扩展ASCII码,使用8位二进制数进行编码,表示256种可能的字符。ASCII字符集中,一个英文占一个字节,即1位。
2.ISO-8859-1(Latin-1)
也称为拉丁码表或欧洲码表,主要用于显示西欧语言。它使用单字节编码,支持256个字符,兼容ASCII编码,但不支持汉字。
3.GB2312
1980年发布,1981年5月1日实施的简体中文汉字编码国家标准。收录7445个图形字符,其中包括6763个简体汉字。
4.BIG5
又称大五码或五大码。是台湾和香港地区广泛使用的一种字符编码标准,主要用于表示繁体中文字符。共收录13053个中文字,1984年实施。
5.GBK
2000年3月17日发布,收录21003个汉字。包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。简体中文版Windows,默认使用GBK字符集。系统显示:ANSI。
- GBK字符集完全兼容ASCII字符集。
- 一个英文字母使用一个字节存储,即8位,兼容ASCII,二进制前面补0。
- 一个汉字使用两个字节存储,即16位。前面的8位是高位字节,后面的8位是低位字节。
- 高位字节二进制一定以1开头,转成十进制之后是一个负数。
6.Unicode
又叫万国码。国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。
三、编码格式
(一)编码格式概述
定义:编码格式是指将字符集中的字符,转换为计算机内部存储,或传输时所使用的二进制代码的具体方式。
功能:编码格式规定了字符在存储或传输过程中的二进制表示形式,以及如何处理这些二进制数据。不同的编码格式可能使用不同的字节长度,来表示同一个字符,也可能使用不同的二进制模式,来表示字符集中的字符。
(二)常见编码格式
1.GB18030
对GBK的扩展,最新的中文码表,支持少数民族文字。一个汉字通常占用2个字节,特殊字符可能需要更多字节。
2.Shift-JS
是日本广泛使用的一种字符编码标准,主要用于表示日文字符。它是在ASCII编码的基础上扩展而来的,可以表示日文的平假名和片假名等字符。
3.EUC-KR
是韩国广泛使用的一种字符编码标准,主要用于表示韩文字符。1.
4.UTF-8
一种变长编码的Unicode格式,使用1到4个字节表示字符。UTF-8编码兼容ASCII编码,一个英文字母占1个字节,二进制第一位是0,转成十进制是整数;一个汉字占3个字节,二进制第一位是1,第一个字节转成十进制是负数。UTF-8编码的最大长度是4个字节,可以容纳Unicode标准中的所有字符。
5.UTF-16
另一种Unicode编码格式,通常使用2个或4个字节表示字符。UTF-16编码以16位无符号整数为单位,但并非所有字符都只用16位表示。
6.UTF-32
一种固定长度的Unicode编码方式,每个字符(中英文)固定使用4个字节表示。适用于需要严格区分字符和编码的场景,例如文本编辑器、网页开发等。
四、区别总结
- 字符集定义了可以使用的字符范围,而编码格式则规定了这些字符在存储或传输过程中的二进制表示形式。
- 字符集是字符与二进制数据之间的映射关系,而编码格式则是实现这种映射关系的具体方式。
- 在选择字符集和编码格式时,需要根据具体的应用场景和需求进行选择,以确保文本数据的正确存储、传输和显示。
五、乱码问题
1.出现原因
原因1:读取数据时未读完整个汉字
原因2:编码和解码时的方式不统一
2.解决方式
方式一:不要用字节流读取文本文件
方式二:编码解码时使用同一个码表,同一个解码方式
3.字节流读取中文时出现乱码,但在拷贝过程中却不乱码的原因
这主要涉及到编码方式及字节处理机制的不同:
字节流是以字节为单位进行数据传输的,它不关心数据的具体内容,只是简单地按照字节顺序进行读写。当使用字节流读取包含中文的文本文件时,如果文件的编码格式(如UTF-8、GBK等)与读取时使用的编码格式不一致,就会出现乱码。这是因为不同的编码格式对字符的编码方式不同,导致相同的字节序列在不同的编码下被解释为不同的字符。
在拷贝过程中,乱码问题通常不会出现,这是因为大多数现代操作系统和文件管理器都具备自动检测和处理文件编码的能力。当进行文件拷贝时,文件管理器会保留原文件的编码格式,并在拷贝后的文件中使用相同的编码格式进行存储。因此,即使拷贝后的文件被不同的程序或设备读取,只要它们能够正确识别并应用该编码格式,就不会出现乱码。
字节流读取文件:
字节流拷贝文件:
六、Java中编码和解码的方法
(一)编码
将要存储的数据转为能真正在计算机硬盘中存储的字节数据。
在Java中,编码的主要目的是将字符(如中文、英文等)转换为计算机能够理解和存储的字节序列。这个过程中,需要指定一个字符集(如UTF-8、GBK等)来确定每个字符对应的字节表示。
public class CharsetDemo3 {public static void main(String[] args) throws UnsupportedEncodingException {// 1.编码:在存储时会转换成二进制存放在硬盘中// 未指定编码格式,IDEA中默认是UTF-8String str = "aaabbb张三";byte[] bytes = str.getBytes(); System.out.println(Arrays.toString(bytes));System.out.println("字节长度" + bytes.length);// [97, 97, 97, 98, 98, 98, -27, -68, -96, -28, -72, -119]// 字节长度12// 指定编码格式为GBKbyte[] bytes1 = str.getBytes("GBK"); // 注意:要抛异常System.out.println(Arrays.toString(bytes1));System.out.println("字节长度" + bytes1.length);// [97, 97, 97, 98, 98, 98, -43, -59, -56, -3]// 字节长度10}
}
(二)解码
将字节数据转换为想要查看的内容。
解码是将已经编码的数据恢复成原始形式的过程,即将字节数据转换回字符数据。在Java中,解码的主要目的是将存储或传输的字节序列,转换回人类可读的字符数据。这个过程中,同样需要指定一个字符集,来确定每个字节对应的字符。
public class CharsetDemo3 {public static void main(String[] args) throws UnsupportedEncodingException {// 2.解码:将字节数据转换为想要查看的内容// 未指定解码格式,IDEA默认是UTF-8String str1 = new String(bytes);System.out.println(str1);// aaabbb张三// 编码时使用UTF-8,解码时使用GBKString str2 = new String(bytes, "GBK");System.out.println(str2);// aaabbb寮犱笁// 编码时使用GBK,解码时使用GBKString str3 = new String(bytes1, "GBK");System.out.println(str3);// aaabbb张三}
}