Unicode:

官网: https://home.unicode.org/

  • Unicode Version 14.0标准版本的发布声明(2021-09-14):
    https://home.unicode.org/announcing-the-unicode-standard-version-14-0/
  • V 14.0的标准文档:
    http://www.unicode.org/versions/Unicode14.0.0/
  • 技术文档(有术语查询,问答FQA,其他):
    http://unicode.org/main.html
  • 字符的代码和图像:
    http://www.unicode.org/charts/
  • 博客(记录发布概要-按时间):
    http://blog.unicode.org/
  • 文档注册表(按年份时间分类):
    https://www.unicode.org/L2/
  • Unicode CLDR(Common Locale Data Repository)
    https://cldr.unicode.org/
    Unicode Locale Data Markup Language. The XML specification for the exchange of locale data, defined by Unicode Technical Standard#35, “Unicode Locale Data Markup Language (LDML).” (See also Unicode Common Locale Data Repository.)
  • ICU(International Components for Unicode)
    C/C++和Java的开源库的集合,可以对Unicode和国际化的支持。
    https://icu.unicode.org/

入门(从完全不了解开始):

进入官网—》选择最新发布版本的声明—》滚到最后,点击Unicode standard标准—》选择 第一章Introduction(介绍),打开ch01.pdf。
相当于进入: https://www.unicode.org/versions/Unicode14.0.0/ch01.pdf

第一章Introduction(介绍,共9页,稍微介绍一下) 要点:

1)Unicode标准为每一个字符指明一个数字值(即code point,码点)和一个名称。

2) Unicode字符以三种编码格式之一表示:一个是32bit格式(UTF-32),一个是16bit格式(UTF-16),一个是8bit格式(UTF-8)。UTF-8,这个8bit的,面向字节的格式,被设计成与现有的基于ASCII格式的系统兼容。

3)Unicode标准 包含 1,114,112 个 码点(code points)。

4)最开始的65,536个code point(0到0xFFFF之间)是用的最多的主体,也称之为BMP(Basic Multilingual Plane)(基本的多语言级别)

5)Unicode标准V14.0版本 一共包含144697个来自世界的图形的字符。

6) Unicode标准保留了 6,400个 code points在 BMP 可以为私有使用,可以使用不包含在Unicode标准里的字符。

第二章 General Structure(主要结构,共63页,具体讲解):

2.4 Code Points and Characters

  • codespace:一定范围内的整数用来对抽象的字符(abstract character,抽象的就是不知到底是什么)进行编码。
  • code point: 在codespace的整数集合里的一个特定的整数。
  • encoded character(编码字符):就是具体的,已知的。当在codespace里的一个抽象字符映射或赋值给一个具体的code point,则其指向一个编码字符。
  • 字符总数:在Unicode标准里,codespace的范围是0x0~0x10FFFF,总共1,114,112个。
  • codespace的分配(allocation): codespace是有组织的,特定范围内的codespace会用作在某一类的抽象字符。
  • 码点(code point)的表示方法: 一般用"U+"为前缀,其后的数字是16进制。比如,U+0061表示字母a
  • code point类型:Graphic、Format、Control、Private-use; Surrogate、Noncharacter、Reserved

2.5 Encoding Forms(3种编码格式介绍)
2.8 Unicode Allocation(BMP概要)
2.9 Details of Allocation(BMP具体讲解)
2.11 Combining Characters(字符组合在一起显示,不同的字符合并为一个字符)

  • \u092b\u093f
  • \u0061\u0308\u0303\u0323\u032d

单个a,和其他字符分开:

//
组合在一起:

2.13 Special Characters(特殊字符)

  • Byte Order Mark (BOM):UTF-32和UTF-16是对大小端敏感的,用 U+FEFF和 U+FFFE这两个大小端镜像翻转
  • The Replacement Character:U+FFFD,可以替代未知的字符。

第三章 Conformance(一致性,共86页,大部分是规范和annexe(附件)):

3.8 Surrogates(替代者)

  • D71 High-surrogate code point: A Unicode code point in the range U+D800 to U+DBFF.
  • D72 High-surrogate code unit: A 16-bit code unit in the range D800 to DBFF, used in UTF-16 as the leading code unit of a surrogate pair.
  • D73 Low-surrogate code point: A Unicode code point in the range U+DC00 to U+DFFF.
  • D74 Low-surrogate code unit: A 16-bit code unit in the range DC0016 to DFFF16, used in UTF-16 as the trailing code unit of a surrogate pair.
  • D75 Surrogate pair: A representation for a single abstract character that consists of a sequence of two 16-bit code units, where the first value of the pair is a high-surrogate code unit and the second value is a low-surrogate code unit.

3.9 Unicode Encoding Forms(Unicode编码格式)
Unicode标准支持3个字符编码格式:UTF-32、UTF-16、UTF-8.每一种编码格式会包会把码点(code point)在U+0000…U+D7FF 和 U+E000…U+10FFFF 映射到一个独一无二的代码单元(code unit)序列。而代码单元的大小是被编码格式规定的。本节将会展示这3种编码格式的正式定义。

  • D76 Unicode scalar value(标量值):除了High-surrogate code point和 Low-surrogate code point(上一节有定义)的Unicode 码点。

    • 其值在0 ~D7FF 和 E000 ~ 10FFFF。闭区间。
  • D77 code unit(代码单元):The minimal bit combination that can represent a unit of encoded text for processing or interchange.

    • 代码单元是计算机存储的部分单元。UTF-8的代码单元是8bit,UTF-16是16bit,UTF-32是32bit。
    • 代码单元在信息产业也称为code value。
    • 在 Unicode 标准中,某些代码单元的特定值不能单独用于表示编码字符。 此限制适用于 UTF-16 中的单独的Surrogate(替代者)代码单元和 UTF-8 中的字节 80 ~FF。
  • D78 Code unit sequence(代码单元序列):一个有序的代码单元序列,一个或多个。

    • 当代码单元是8bit时,也称之位字节序列。
  • D79 Unicode 编码形式(Unicode encoding form)将每个 Unicode 标量值分配给一个唯一的代码单元序列。

    • 由于历史原因,Unicode 编码形式也称为 Unicode(或 UCS)transformation formats (UTF)。 这个词实际上是模棱两可的它用于编码形式和编码方案之间。
    • Unicode标量值的集合与代码单元序列集合之间建立一 一映射的关系。
  • D80 Unicode string: A code unit sequence containing code units of a particular Unicode encoding form.

  • D81 Unicode 8-bit string: A Unicode string containing only UTF-8 code units.

  • D82 Unicode 16-bit string: A Unicode string containing only UTF-16 code units.

  • D84 Ill-formed(格式错误):声称采用 Unicode 编码形式的 Unicode 代码单元序列称为格式错误,当其不遵循该 Unicode 编码格式的规范。

    • 例如,对应于定义的 Unicode 标量值范围之外的码点的任何代码单元序列都将是格式错误的。
  • D85 Well-formed(格式正确):遵守规范。
    例子:

码点 编码格式 代码单元序列
U+004D UTF-32 0000004D
UTF-16 004D
UTF-8 4D
U+0430 UTF-32 00000430
UTF-16 0430
UTF-8 D0 B0
U+4E8C UTF-32 00004E8C
UTF-16 4E8C
UTF-8 E4 BA 8C
U+10302 UTF-32 00010302
UTF-16 D800 DF02
UTF-8 F0 90 8C 82

UTF-32:

UTF-16:

  • D91 UTF-16 encoding form: 这种格式将Unicode标量值,位于U+0000…U+D7FF 和 U+E000…U+FFFF,映射到1个无符号的16bit代码单元上(标准值与代码单元值相同);而对于标量值,位于U+10000…U+10FFFF之间,映射到一个surrogate pair(定义间3.8 Surrogates)
  • surrogate pair值的计算,见附录Appendix C.3, UTF-8 and UTF-16.
标量值 UTF-16
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
000uuuuuxxxxxxxxxxxxxxxx 110110wwwwxxxxxx 110111xxxxxxxxxx

Note: wwww = uuuuu - 1
UTF-8:

  • D92 UTF-8 encoding form: 这个编码格式把每个Unicode标量值映射到字节序列上(1个字节、2个字节、3个字节或4个字节)。具体见下表。
  • 具体见附录 Appendix C.3, UTF-8 and UTF-16
标量值 第一字节 第二字节 第三字节 第四字节
00000000 0xxxxxxx 0xxxxxxx
00000yyy yyxxxxxx 110yyyyy 10xxxxxx
zzzzyyyy yyxxxxxx 1110zzzz 10yyyyyy 10xxxxxx
000uuuuu zzzzyyyy yyxxxxxx 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx

正确的格式:

标量值 第一字节 第二字节 第三字节 第四字节
U+0000…U+007F 00…7F
U+0080…U+07FF C2…DF 80…BF
U+0800…U+0FFF E0 A0…BF 80…BF
U+1000…U+CFFF E1…EC 80…BF 80…BF
U+D000…U+D7FF ED 80…9F 80…BF
U+E000…U+FFFF EE…EF 80…BF 80…BF
U+10000…U+3FFFF F0 90…BF 80…BF 80…BF
U+40000…U+FFFFF F1…F3 80…BF 80…BF 80…BF
U+100000…U+10FFFF F4 80…8F 80…BF 80…BF

3.10 Unicode Encoding Schemes(编码方案)

  • D95 UTF-8 encoding scheme: UTF-8数据流使用 <EF BB BF>,作为其开头表示时UTF-8编码。
  • 我们在window系统下,创建一个UTF-8编码的文本文件,内容时aaa。查看该文件的hex格式,开始时 EF BB BF,后面61 61 61就是文本内容aaa了。
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。PS D:\docsify\docs> type .\a.txt
aaaPS D:\docsify\docs> format-Hex -Path .\a.txt路径: D:\docsify\docs\a.txt00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F00000000   EF BB BF 61 61 61                                aaa
  • D98 UTF-16 encoding scheme: 用BOM开头,<FE FF>表示大端、<FF FE>表示小端。如果没有BOM,且缺少上层协议,则默认其为大端。

第n章:

Java与 UTF-16编码

  • 在设计Java时决定采用16位的Unicode字符集,这样会比使用8位字符集的程序设计语言有很大的改进。
  • 在Java中,char类型描述了UTF-16编码中的一个代码单元,即16bit大小。
  • Supplementary characters(补充字符)在Unicode里的字符其code point超过了U+FFFF。
    • Oracle文档:在Java平台的补充字符
  • UTF-16编码采用不同长度的编码表示所有Unicode码点。在基本的多语言级别中,每个字符用16位表示,通常被称为代码单元(code unit);而辅助字符采用一对连续的代码单元进行编码。这样构成的编码值落入基本的多语言级别中空闲的2048字节内,通常被称为替代区域(surrogate area)[U+D800~U+DBFF用于第一个代码单元,U+DC00~U+DFFF用于第二个代码单元]。这样设计十分巧妙,我们可以从中迅速地知道一个代码单元是一个字符的D编码,还是一个辅助字符的第一或第二部分
  • 原来的16字节可以表示0-0xFFFF(共65536个字符),加上替代区域则多了(DBFF-D800+1)*(DFFF-DC00+1)=256*1025=262144个字符。

结尾

1)Unicode在线测试工具
2)Unicode:Surrogate Pairs UTF-16中用于扩展字符

3)https://graphemica.com/