Java 字符串与编码-之常用编码
Java 字符串与编码
1. 先说编码 在计算机的发展历程之中,出现过很多编码。其中最著名的肯定要数
[1]编码.
-
- ASCII 标准的ASCII的编码是一个字节,8个bit,但其实只用了128个编码值0000 0000
- 0111
1111,当然现在基于x86系统都支持扩展的ASCII,把剩下的128个编码也用上了.但标准的ASCII就是128个字符.
-
latin1 Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。也是一个字节,
8个bit, 但是256个编码都用上了,前128个编码与ASCII一致.
ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。 -
Unicode 编码 百度百科:
Unicode(又称统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000至0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
[详情可见Unicode百度百科]Unicode 有 UCS-2 和 UCS-4 两种编码, UCS-2 是两个字节编码, 码位有 $2^{16}$个,
UCS有四个字节来编码, 可以容纳的最大码位是 $2^{16}$ * $2^{16}$. 但其实 UCS-4
每个平面是 $2^{16}$个码位, 有17个平面. 其中0平面(BMP)与 UCS-2 一样. -
UTF-8 Unicode 编码的一种可变字节编码方式, 其最小的编码大小为8位, 一个字节.
因为Unicode(UCS-4)是4个字节的编码, 所以会消耗特别大的空间,
但其实最常用的编码并不多, 设想一下,大量的英文字母都是使用4个字节存储. 所以有UTF-8,
UTF-16 的编码方式, 主要是为了减少 英文字母等BMP内的存储空间.Unicode编码(十六进制) UTF-8 字节流(二进制) 000000-00007 0xxxxxxx 000080-0007FF 110xxxxx 10xxxxxx 000800-00FFFF 1110xxxx 10xxxxxx 10xxxxxx 010000-10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 从表格中可以看出, UTF-8 的第一个字节是一种前缀编码, 0b10
开头的字节只能确认不是编码的首字节. -
UTF-16 详细的编码可以见 百度百科
Word : 两个字节的无符号整数 -
BMP平面是 0x0000- 0xFFFF, 可以直接用两个字节表示, D800 -DFFF
是保留下来的代理区, 详细的是
编码区域 | 描述 |
---|---|
D800-DB7f | 高位替代 |
DB80-DBFF | 高位专用替代 |
DC00-DFFF | 低位替代 |
如果这里我没理解错的话, UTF-16 的 0xDFFF -
0xD800个位置(十进制是2048)是比BMP少的码位.
Unicode编码0x10000-0x10FFFF的UTF-16编码需要两个Word, 减去 0x10000 ( 0xFFFF +
1 )之后 刚好是0xFFFFF, 可以直接用20位来表示.
另一种算法是17个平面减去一个是16个, 16刚好是4位可以表示的, 4位加两字节16位就是20位
当需要两个word的时候, 第一个高6位110110[00] = D8 第二个高6位 110111[00] = DC
都去掉 那么剩下的20位拼起来就是 Unicode码值 - 0xFFFF
ASCII ((American St**andard Code for Information Interchange):
美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC
646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符 ↩︎