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


  1. ASCII ((American St**andard Code for Information Interchange):
    美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC
    646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符 ↩︎

原文地址:https://www.cnblogs.com/zh1903/p/13906936.html