Unicode 编码

注意
本文最后更新于 2023-11-16,文中内容可能已过时。

Unicode 编码

官方文档:

TODO,整理一下官网,TODO

Unicode 标准说明书

参考博客:

Unicode 与 JavaScript 详解 - 阮一峰的网络日志

字符编码笔记:ASCII,Unicode 和 UTF-8 - 阮一峰的网络日志

基本原理

Unicode 源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了。

Unicode 的最新版本是 15.0 版,一共收入了 109449 个符号,其中的中日韩文字为 74500 个。可以近似认为,全世界现有的符号当中,三分之二以上来自东亚文字。比如,中文"好"的码点是十六进制的597D

1
U+597D = 

这么多符号,Unicode 不是一次性定义的,而是分区定义。每个区可以存放 65536 个($2^{16}$次方)字符,称为一个平面(plane)。目前,一共有 17 个($2^5$次方)平面,也就是说,整个 Unicode 字符集的大小现在是$2^{21}$。

最前面的 65536 个字符位,称为基本平面(Basic Multilingual Plane,缩写 BMP),它的码点范围是从 0 一直到$2^{16}-1$,写成 16 进制就是从U+0000U+FFFF。所有最常见的字符都放在这个平面,这是 Unicode 最先定义和公布的一个平面。剩下的字符都放在辅助平面(Supplementary Multilingual Plane,缩写 SMP),码点范围从 U+010000 一直到 U+10FFFF。

其实还有一个 SIP(Supplementary Ideographic Plane),只用于表示有很少使用的日文、中文和韩文。这一层被称为补充表意平面 (平面 2,SIP) 或互补表意区域。

需要注意的是,Unicode 只是一个符号集,一个逻辑符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。这就需要二次编码

比如,汉字严的 Unicode 是十六进制数 4E25,转换成二进制数足足有 15 位(100111000100101),也就是说,这个符号的表示至少需要 2 个字节。表示其他更大的符号,可能需要 3 个字节或者 4 个字节,甚至更多。

这里就有两个严重的问题,第一个问题是,如何才能区别 Unicode 和 ASCII?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是 0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

Unicode transformation format :UTF

UTF-32

UTF-8

UTF-16

Emoji

稍微了解一下,TODO

可以尝试在日志中输出表情包

零宽度字符

浅析什么是零宽度字符以及零宽度字符在实际中的应用场景 - 古兰精 - 博客园

这篇博客讲的很好


Java 核心技术卷一_第 3 章_Java 基本程序设计结构

0%