Unicode记录
主要是摘抄记录一下这个Unicode,挺厉害的一个东西
Unicode 码位(Code Point)的命名规则遵循一套标准化的格式,其核心是 十六进制表示法 和 U+前缀。以下详细解析这种命名方式的由来和规则:
- U+前缀:
- **"U" 表示 **Unicode,用于明确这是 Unicode 标准中的码位。
- "+" 是固定符号,用于分隔前缀和码位值。
- 6C49(十六进制值):
- **这是码位的具体数值,采用 **十六进制(Base-16)表示法。
- 十六进制是计算机领域常用的表示法,因为它能更紧凑地表示二进制数据。
- 示例:
6C49
转换为十进制是27721
,表示该字符在 Unicode 空间中的唯一编号。
命名规则的由来
- Unicode 码位空间:
- **Unicode 码位范围是 **U+0000 到 U+10FFFF,共 1,114,112 个可能的码位。
- 每个码位对应一个唯一的字符或符号。
- 十六进制的优势:
- **二进制(如 **
110110001001001
)可读性差。 - **十进制(如 **
27721
)无法直观反映计算机存储结构。 - **十六进制(如 **
6C49
)既能紧凑表示,又能直接映射到内存地址。
- **二进制(如 **
- 历史传承:
- **继承自 ASCII 编码的十六进制表示法(如 **
0x41
表示 'A')。 - 统一了不同编码体系的表示方式。
- **继承自 ASCII 编码的十六进制表示法(如 **
码位命名示例
字符 | 码位 | 解释 |
---|---|---|
A | U+0041 | 拉丁字母 'A',ASCII 编码延续 |
汉 | U+6C49 | 中文汉字 "汉" |
😊 | U+1F60A | Emoji 笑脸 |
𝄞 | U+1D11E | 音乐符号 G 谱号 |
常见编码
- UTF-8 编码:
- **码位 **
U+6C49
转换为 UTF-8 是0xE6 0xB1 0x89
。 - 编码规则:
- 单字节:
0xxxxxxx
(ASCII 范围) - 多字节:
110xxxxx 10xxxxxx 10xxxxxx
(汉字等)
- 单字节:
- **码位 **
- UTF-16 编码:
- **码位 **
U+6C49
在 UTF-16 中是0x6C49
。 - **如果码位超过 **
U+FFFF
,使用代理对(Surrogate Pair)。
- **码位 **
- UTF-32 编码:
- **码位 **
U+6C49
直接存储为0x00006C49
。
- **码位 **
转换实现
转换步骤(以 U+6C49 为例)
- 确定码位范围 ** 码位 U+6C49 的十六进制值是 6C49。 ** 范围:U+0800 - U+FFFF,因此使用 3 字节 编码。
- 将码位转换为二进制 ** 十六进制 6C49 转换为二进制: ** 6 C 4 9 ** 0110 1100 0100 1001 ** 完整二进制:01101100 01001001(16 位)。
- 填充 UTF-8 编码模板 ** 3 字节 UTF-8 模板: ** 1110xxxx 10xxxxxx 10xxxxxx ** 将码位的二进制按从右到左填充到模板中: ** 01101100 01001001 ** 第一个 10xxxxxx:填充后 8 位 01001001 → 1001001 → 10 + 01001001 = 1001001 → 0x89。 ** 第二个 10xxxxxx:填充后 6 位 011000 → 10 + 011000 = 10011000 → 0xB1。 ** **第三个 1110xxxx:填充后 4 位 0110 → 1110 + 0110 = 11100110 → 0xE6。
- 组合结果 ** 按顺序组合填充后的字节: ** 11100110 10110001 10001001 ** 转换为十六进制: ** 0xE6 0xB1 0x89