【Java-IO】字符集(Character Set)、字符编码(Character Encoding)、字符编码比较、乱码
八、IO
文章目录
03_字符集(Character Set)
在计算机里面
- 一个中文汉字是一个字符
- 一个英文字母是一个字符
- 一个阿拉伯数字是一个字符
- 一个标点符号是一个字符
- …
字符集(简称 Charset):由字符组成的集合字符集(Character Set)
常见的字符集有:
ASCII
:128个字符(包括了英文字母大小写、阿拉伯数字等)ISO-8859-1
:支持欧洲的部分语言文字,在有些环境也叫 Latin-1GB2312
:支持中文(包括了 6763 个汉字)ASCII
:128个字符(包括了英文字母大小写、阿拉伯数字等)ISO-8859-1
:支持欧洲的部分语言文字,在有些环境也叫 Latin-1GB2312
:支持中文(包括了 6763 个汉字)
ISO-8859-1
、GB2312
、BIG5
、GBK
、GB18030
、Unicode
中都已经包括了 ASCII
中的所有字符
04_字符编码(Character Encoding)
每个字符集都有对应的字符编码,它决定了每个字符如何转成二进制存储在计算机中。
- 一个字节 = 8位二进制,即 1Byte = 8bit
- 关于一个字符等于多少字节,是不确定的,主要看编码方式。
ASCII
:单字节编码,编码范围是 0x00 ~ 0x7F (0 ~ 127)
ISO-8859-1
:单字节编码,编码范围是 0x00 ~ 0xFF
- 0x00 ~ 0x7F 和
ASCII
一致,0x80 ~ 0x9F 是控制字符,0xA0 ~ 0xFF 是文字符号
GB2312
、BIG5
、GBK
:采用双字节表示一个汉字
GB18030
:采用单字节、双字节、四字节表示一个字符
Unicode
:有 Unicode
、UTF-8
、UTF-16
、UTF-32
等编码,最常用的是 UTF-8
编码
UTF-8
采用单字节、双字节、三字节、四字节表示一个字符
字符编码比较
String str = "MJ码哥";str.getBytes("ASCII"); // [ 77, 74, 63, 63 ]str.getBytes("ISO-8859-1"); // [ 77, 74, 63, 63 ]str.getBytes("GB2312"); // [ 77, 74, -62, -21, -72, -25 ]str.getBytes("BIG5"); // [ 77, 74, 63, -83, -12 ]str.getBytes("GBK"); // [ 77, 74, -62, -21, -72, -25 ]str.getBytes("GB18030"); // [ 77, 74, -62, -21, -72, -25 ]str.getBytes("UTF-8"); // [ 77, 74, -25, -96, -127, -27, -109, -91 ]
如果 String.getBytes
方法没有传参,就使用 JVM 的默认字符编码,一般跟随 main 方法所在文件的字符编码。
可以通过 Charset.defaultCharset
方法获取 JVM 的默认字符编码
Charset
类的全名是java.nio.charset.Charset
乱码
计算机中真正的代码其实是二进制,所以转到它是编码,它转别的就是解码
- 【字符串】转为【二进制】的过程:编码(Encode)
- 【二进制】转为【字符串】的过程:解码(Decode)
编码、解码时使用的字符编码必须要保持一致,否则会造成乱码
String str1 = "Java不难";// UTF-8编码为二进制: [74, 97, 118, 97, -28, -72, -115, -23, -102, -66]byte[] bytes = str1.getBytes("UTF-8");// GB18030解码: Java涓嶉毦String str2 = new String(bytes, "GB18030");// UTF-8解码: Java不难String str3 = new String(bytes, "UTF-8");