io流(学习笔记03)字符集
常见字符集
-
ASCII - American Standard Code for Information Interchange(美国信息交换标准代码)。这是一个7位的编码方案,总共定义了128个字符,包括控制字符和可打印字符。它是最早广泛使用的字符编码之一(以0开头,使用一个字节存储一个字符)。
-
ISO-8859-1 - 也称为 Latin-1,这是一个8位的编码方案,提供了256个字符,涵盖了西欧语言中的大部分字符。
-
GBK - 这是中国大陆地区使用的一种汉字编码标准,兼容GB2312并扩展支持更多的汉字和符号(以1开头,使用两个字节存储一个中文编码字符)。
-
UTF-8 - Unicode Transformation Format(Unicode转换格式)。UTF-8 是一种可变长度的编码方案,它可以编码世界上几乎所有的字符。UTF-8 是互联网上最常用的编码格式之一,并且是向前兼容ASCII的。
-
UTF-16 - 这也是一种Unicode编码方式,使用1到2个字节来编码常见的字符,对于较不常用的字符则使用4个字节。UTF-16常用于某些操作系统内部以及某些编程语言(如Java)的字符串表示。
-
UTF-32 - 这种编码方式使用固定长度的32位来存储每一个字符,使得处理变得简单,但同时也使得存储效率较低。
-
GB2312 - 这是中国最早的国家标准汉字字符集,主要用于简体中文环境。
-
Big5 - 主要用于台湾地区的繁体中文字符集。
-
EUC-JP - Extended Unix Code - Japan,用于日语字符的编码。
-
Shift_JIS - 这是一种日本的字符集,由微软开发,是日本地区最常用的编码之一。
-
ISO-2022-JP - 这是一种用于日语的多层字符集编码方案。
字符集 : UTF-8
-
兼容ASCII
-
UTF-8是ASCII的超集,这意味着所有ASCII字符在UTF-8中都用一个字节表示。这使得UTF-8与早期的编码方案兼容,并且对于ASCII范围内的文本处理起来非常简单。
-
可变长度编码
-
UTF-8使用1到4个字节来编码一个Unicode字符(英文和数字占1个字节,汉字占3个字节):
-
一个字节(0xxxxxxx)表示ASCII字符(00000000-01111111)。
-
两个字节(110xxxxx 10xxxxxx)表示00000000-0000007F之间的字符。
-
三个字节(1110xxxx 10xxxxxx 10xxxxxx)表示00000080-00007FFF之间的字符。
-
四个字节(11110xxx 10xxxxxx 10xxxxxx 10xxxxxx)表示00008000-10FFFF之间的字符。
-
-
国际支持
-
UTF-8可以表示Unicode标准中的所有字符,包括但不限于各种语言文字、符号、表情符号等,因此非常适合用于需要支持多种语言的应用程序。
-
排序一致性
-
对于很多语言来说,UTF-8编码后的字节顺序与自然的字典序是一致的,这意味着你可以直接比较字节来判断字符的顺序。
-
错误处理
-
如果数据中包含无效的UTF-8序列,可以尝试将其解释为一个特殊的错误字符(例如Unicode中的U+FFFD REPLACEMENT CHARACTER),或者直接忽略。
-
存储效率
-
对于大部分文本数据,UTF-8比固定长度的Unicode编码(如UTF-16和UTF-32)更加节省存储空间,特别是当文本主要由常用字符组成时。
-
网络友好
-
在网络传输过程中,即使部分数据丢失或损坏,未受影响的部分依然可以正确解析,这对于数据传输非常有利。
-
易于实现
-
编码和解码算法相对简单,易于实现高效的处理逻辑。
-
BOM(Byte Order Mark)
-
尽管UTF-8没有字节序的问题,但可以在文件开头放置一个BOM(EF BB BF),用来标识文件的编码类型。不过,在很多情况下,这种标识并不是必要的,有时甚至会被认为是多余的。
-
编码规则
-
UTF-8的编码规则允许你在编码时通过检查最高位来判断一个字节是否属于某个字符的编码序列。
必须知道
-
ASCII字符集:只有英文、数字、符号等,占1个字节
-
GBK字符集:汉字占2个字节,英文、数字占1个字节
-
UTF-8字符集:汉字占3个字节,英文、数字占1个字节
注意:
字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码。 英文,数字一般不会乱码,因为很多字符集都兼容了ASCII编码。
字符集的编码和解码操作
Java代码完成对字符的编码
String提供了如下方法 | 说明 |
---|---|
byte[] getBytes() | 使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中 |
byte[] getBytes(String charsetName) | 使用指定的字符集将该 string编码为一系列字节,将结果存储到新的字节数组中 |
Java代码完成对字符的解码
String提供了如下方法 | 说明 |
---|---|
String(byte[] bytes) | 通过使用平台的默认字符集解码指定的字节数组来构造新的 string |
String(byte[] bytes,String charsetName) | 通过指定的字符集解码指定的字节数组来构造新的string |
代码示例:
public static void main(String[] args) throws Exception {
// 1、编码
String data = "我a你";
byte[] bytes = data.getBytes();// 默认是按照平台字符集(UTF-8)进行编码的
System.out.println(Arrays.toString(bytes));
// 按照指定字符集进行编码。
byte[] bytes1 = data.getBytes("GBK");
System.out.println(Arrays.toString(bytes1));
// 2、解码
String s1 = new String(bytes);// 按照平台默认编码(UTF-8)解码
System.out.println(s1);
String s2 = new String(bytes1);//按照按照平台默认编码(UTF-8)解码
System.out.println(s2);//乱码,因为bytes1是按照GBK来编码的,使用utf-8解码会乱码
String s3 = new String(bytes1, "GBK");//按照指定字符集进行解码
System.out.println(s2);//不会乱码,因为bytes1是按照GBK来编码的,必须使用GBK解码
}
}