[Java NIO]Java 字符集
2020-08-06 本文已影响0人
檀香灰
1.Java 与 Unicode
- Unicode ,也叫做统一码,是计算机领域里的业界标准,包括字符集和编码方案;解决跨语言、跨平台的的文本处理问题,90年开始研发,94年正式公布。
- Unicode 把全世界所有的语言的字符集统一到一个独立的、全面的映射中。
- Java 使用Unicode 表示字符,与以字节为导向的C、C++ 相比,Unicode 的固有支持简化了字符的数据处理。
大部分操作系统在I/O 与文件存储方面仍然是以字节为导向的,所以无论使用何种编码,Unicode或其它,在字节序列和字符集编码之间仍然需要转化。
2.JVM 的字符集
- 每个JVM 都需要支持标准的字符集,如US-ASCII/ISO-8859-1/UTF-8/UTF-16/UTF-16LE/UTF-16BE
- JVM 启动时确定默认值,取决于潜在的操作系统环境、区域设置JVM 设置等
3.Unicode 与 UTF-32/UTF-8
- Unicode 统一了所有字符的编码,是字符集,而字符集只是给所有字符一个唯一的编码;
- Unicode 没有规定如何存储字符
- UTF-32:一个字符使用四个字节存储,也就是32位,涵盖了Unicode 的所有字符;
- UTF-8:变长编码,8位一组表示Unicode 字符格式
UTF-32 规则简单,但是缺陷明显,对一个西文字母,UTF-32 是ASCII 花费空间的四倍 (ASCII 每个字符只需要一个字节存储)。
UTF-8 的编码规则如下(U+ 后面的数字代表 Unicode 字符代码):
U+ 0000 ~ U+ 007F: 0XXXXXXX
U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX
U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX
U+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
可以看到,UTF-8 通过开头的标志位位数实现了变长。对于单字节字符,只占用一个字节,实现了向下兼容 ASCII,并且能和 UTF-32 一样,包含 Unicode 中的所有字符,又能有效减少存储传输过程中占用的空间