Unicode 字符编码相关概念学习总结

首先请看我摘录的这篇文章《字符编码常识及问题解析》,后来感觉还有一些不明白的地方,又在网上到处搜索来进行了学习,收获很大,来博客里记一个笔记。

关于除了 Unicode 的其他编码的介绍,也请看上面这篇文章。

相关链接:

维基百科 Unicode:https://zh.wikipedia.org/zh-hans/Unicode

维基百科 UCS:https://zh.wikipedia.org/zh-cn/通用字符集

维基百科 UTF-8:https://zh.wikipedia.org/zh-cn/UTF-8

维基百科 UTF-16:https://zh.wikipedia.org/wiki/UTF-16

看了很多文章,乱七八糟,最后发现只有维基是最通俗易懂最完善的。

Unicode:

为每一个字符定义唯一的代码(即一个整数)

第一平面为最常用的字符,长度为 16 位。对应 UCS-2。

补充平面 16 个,一共 17 个平面共计需要 21 位表示,但实际占用 32 位,是为了兼容 UCS-4。(未来有扩充至 32bit 的可能)

UCS:

通用字符集(英语:Universal Character Set)

来自 ISO,而 Unicode 是来自统一码联盟。目前虽然有两个标准制作组,但内容都已经统一。

UCS-2 表示用 16bit 表示一个字符,这和 Unicode 1.0 一致。

UCS-4 表示用 31bit 表示一个字符,这比 Unicode 2.0 的表示范围更大,不过目前连 Unicode 的 21 位都还没填满。

UTF:

指的是 Unicode Transformation Format,指的是 Unicode 的具体实现方式。

Unicode 只是很简单的表示:用 21 位表示一个字符,而如何分配这 21 个位则有了不同的 UTF。

UTF-32 就是把所有的字符都用 32bit 来表示,很是浪费。然后 UTF-8、UTF-16 就视情况而定了。UTF-8 可以选择 1~6 个字节中的任多个来表示。而 UTF-16 只能是选两字节或四字节。

UTF-8 中 6 个字节的表示方法:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx,当中有 31 个 x,正好对应 UCS-4 的 31 位值。不过规定是 utf8 最多只能 4 个字节,即 21 个 x(见维基),仅对应着 Unicode 的 21 位,毕竟 UTF 服务于 Unicode 而不是 UCS。

UTF-16:

UTF-16 固定采用 16bit 存储一个字符,所以在第一平面内就是 UCS-2。

而在补充平面使用两个 16bit(代理对)表示一个 UCS-4 的内容,但这只是刚刚够用,如何区分到底是 2 个 ucs2 还是 1 个 ucs4 呢,utf16 运用了 ucs2 中永久保留不映射到任何字符的码段来做文章,具体方法见维基。

在表示这个代理对时,就有了一个顺序的问题,于是产生了大尾序小尾序,为了弄清楚大小尾序,在 utf16 文件的开首,都会固定放置一个 U+FEFF 字符(零宽空格),通过读取识别这个字符的尾序,操作系统就知道了该文件所采用的尾序。

1 条评论
  1. 在 URL 中,`中文` 被 encodeURI 为 “%E4%B8%AD%E6%96%87”
    其实就是 utf8,而中文在 utf8 中占 3 字节,于是 `中` 对应前三个:E4B8AD,`文` 对应后三个:E69687

发表一条评论