Introduction to Unicode and UTF-8

Unicode is an industry standard for consistent encoding of written text. Learn the basics and most important parts of it, in particular concerning UTF-8

Unicode是统一编码书面文本的行业标准

计算机使用许多字符集,但是Unicode是第一个旨在支持地球上(甚至更远!)每一种书面语言的字符集。

其目的是提供一个唯一的数字,以在任何平台上标识每种语言的每个字符。

Unicode将每个字符映射到一个特定的代码,称为代码点。代码点的形式为U+<hex-code>,范围从U+0000U+10FFFF

示例代码点如下所示:U+004F。其含义取决于所使用的字符编码。

Unicode定义不同字符编码,最常用的是UTF-8,UTF-16和UTF-32。

UTF-8绝对是Unicode系列中最流行的编码,尤其是在Web上。例如,本文档以UTF-8编写。

目前,已实施了135.000个不同的字符,并且可容纳110万多个字符。

剧本

所有Unicode支持的字符都分为以下几个部分:剧本

每个不同的字符集都有一个脚本:

  • 拉丁语(包含所有ASCII +所有其他西方字符)
  • 韩国人
  • 老匈牙利人
  • 希伯来语
  • 希腊语
  • 亚美尼亚人
  • …等等!

完整列表在ISO 15924标准

有关脚本的更多信息:https://zh.wikipedia.org/wiki/Script_(Unicode)

飞机

除了脚本之外,Unicode还可以通过另一种方式组织其字符:飞机

而不是按类型对它们进行分组,而是检查代码点值:

飞机 范围
0 U + 0000-U + FFFF
1 U + 10000-U + 1FFFF
2 U + 20000-U + 2FFFF
14 U + E0000-U + EFFFF
15 U + F0000-U + FFFFF
16 U + 100000-U + 10FFFF

有17架飞机。

首先是特殊的,这叫做基本的多语言平面, 或者骨形态发生蛋白,其中包含来自拉丁语,西里尔语和希腊语脚本的大多数现代字符和符号。

其他16架飞机称为星界飞机。值得注意的是,飞机3至13目前是空的。

星体平面中包含的代码点称为星体代码点

星体代码点均高于U+10000

代码单位

代码点在内部存储为代码单位。代码单位是字符的位表示形式,其长度取决于字符编码

UTF-32使用32位代码单元。

UTF-8使用8位代码单元,而UTF-16使用16位代码单元。如果代码点需要更大的尺寸,则将以2个(或以UTF-8为单位)的代码单位表示。

字素

字素是代表书写系统单位的符号。基本上是你的想法角色及其外观。

字形

字形是字素的图形表示:它在屏幕上的视觉显示方式,以及显示器上的实际外观。

顺序

Unicode使您可以组合不同的字符以形成字素。

例如带重音符号的字母:字母é可以通过组合使用字母来表示eU+0065)和名为“ COMBINING ACUTE ACCENT”的Unicode字符(U+0301):

"U+0065U+0301" ➡️ "é"

U+0301在这种情况下被称为合并标记,该字符适用于前一个字符以形成不同的字素。

正常化

有时可以使用不同的代码点组合来表示字符。

例如带重音符号的字母:字母é可以表示为U+00E9以及作为结合eU+0065)和名为“ COMBINING ACUTE ACCENT”的Unicode字符(U+0301):

U+00E9       ➡️ "é"
U+0065U+0301 ➡️ "é"

规范化过程将分析字符串是否存在此类歧义,并生成具有任何字符的规范表示形式的字符串。

如果不进行规范化,则完全相等的字符串将被视为不同,因为它们的内部表示形式发生了变化:

表情符号

表情符号是Unicode星体平面字符,它们提供了一种在屏幕上显示图像的方式,而实际上没有真正的图像,而只是字体字形。

例如,🐶符号被编码为U+1F436

前128个字符

Unicode的前128个字符与ASCII字符集相同。

前32个字符,U+0000--U+001F(0-31)被称为控制码

它们是过去的继承,现在大多数已过时。它们用于电传打字机,这是传真之前存在的东西。

从U + 0020(32)到U + 007E(126)的字符包含数字,字母和一些符号:

统一码 ASCII码 雕文
U + 0020 32 (空间)
U + 0021 33
U + 0022 34
U + 0023 35
U + 0024 36 $
U + 0025 37
U + 0026 38
U + 0027 39 '
U + 0028 40
U + 0029 41
U + 002A 42 *
U + 002B 43 +
U + 002C 44
U + 002D 45 --
U + 002E 46
U + 002F 47 /
U + 0030 48 0
U + 0031 49 1
U+0032 50 2
U+0033 51 3
U+0034 52 4
U+0035 53 5
U+0036 54 6
U+0037 55 7
U+0038 56 8
U+0039 57 9
U + 003A 58
U + 003B 59 ;
U + 003C 60 <
U + 003D 61 =
U + 003E 62 >
U + 003F 63
U+0040 64 @
U+0041 65 一种
U+0042 66
U+0043 67 C
U+0044 68 d
U+0045 69 E
U+0046 70 F
U+0047 71 G
U+0048 72 H
U+0049 73 一世
U + 004A 74 Ĵ
U + 004B 75 ķ
U + 004C 76 大号
U + 004D 77 中号
U + 004E 78 ñ
U + 004F 79 Ø
U+0050 80 P
U+0051 81
U+0052 82 [R
U+0053 83 小号
U+0054 84 Ť
U+0055 85 ü
U+0056 86 伏特
U+0057 87 w ^
U+0058 88 X
U+0059 89 ÿ
U + 005A 90 ž
U + 005B 91 [
U + 005C 92
U + 005D 93 ]
U + 005E 94 ^
U + 005F 95 _
U+0060 96 `
U+0061 97 一种
U+0062 98 b
U+0063 99 C
U+0064 100 d
U+0065 101 Ë
U+0066 102 F
U+0067 103 G
U+0068 104 H
U+0069 105 一世
U + 006A 106 Ĵ
U + 006B 107 ķ
U + 006C 108
U + 006D 109
U + 006E 110 ñ
U + 006F 111 Ø
U+0070 112 p
U+0071 113 q
U+0072 114 [R
U+0073 115 s
U+0074 116 Ť
U+0075 117 ü
U+0076 118 v
U+0077 119 w
U+0078 120 X
U+0079 121 ÿ
U + 007A 122 ž
U + 007B 123 {
U + 007C 124
U + 007D 125 }
U + 007E 126
  • 数字从U+0030U+0039
  • 大写字母从U+0041U+005A
  • 小写字母从U+0061U+007A

U + 007F(127)是删除字符。

将来的一切都超出了ASCII的范围,并且是Unicode的一部分。

您可以在Wikipedia上找到整个列表:https://zh.wikipedia.org/wiki/List_of_Unicode_characters

Unicode编码

UTF-8

UTF-8是一种可变宽度的字符编码,它可以使用1到4个8位字节来编码Unicode覆盖的每个字符。

它最初是由Ken Thompson和Rob Pike于1992年设计的。那些对Go编程语言感兴趣的人都熟悉这些名称,因为它们也是该语言的两个原始创造者。

W3C建议将其作为HTML文件中的默认编码,并且统计数据表明,截至2018年4月,已在所有网页的91,3%上使用它。

在引入之时,ASCII是西方世界中最流行的字符编码。在ASCII中,所有字母,数字和符号都分配有一个数字,以及该数字。固定为8位,最多只能表示255个字符,这就足够了。

UTF-8设计为向后兼容ASCII。这对于采用它非常重要,因为ASCII年代更早(1963年)并且广泛使用,并且向UTF-8迁移几乎是透明的。

UTF-8的前128个字符完全映射到ASCII。为什么是128?因为ASCII使用7位编码,所以最多允许128种组合。为什么是7位?现在,我们认为8位是理所当然的,但是在ASCII诞生之初,7位系统也很流行。

由于与ASCII 100%兼容,因此UTF-8也非常有效,因为西方语言中最常用的字符仅用1个字节编码。

这是字节使用情况的映射:

字节数 开始 结尾
1 U+0000 U+007F
2 U+0080 U+07FF
3 U+0800 U+FFFF
4 U+10000 U+10FFFF

还记得ASCII中的字符被编码为数字吗?如果信A以ASCII表示的数字65,使用UTF-8编码为U+0041

为什么不U+0065你问?好吧,因为unicode使用十六进制基数,而不是10你有U+000A依此类推(基本上,您有一组16位数字而不是10位数字)

看一眼这个视频,很好地解释了这种UTF-8和ASCII兼容性。

UTF-16

UTF-16是另一种非常流行的Unicode编码。例如,这就是Java在内部表示任何字符的方式。这也是JavaScript内部使用的2种编码之一, 随着UCS-2。它也被许多其他系统使用,例如Windows。

UTF-16是一种可变长度编码系统,与UTF-8类似,但是对于任何字符表示形式,最少使用2个字节(16位)。因此,它向后与ASCII标准不兼容。

基本多语言平面(BMP)中的代码点使用2个字节存储。中的代码点星界飞机使用4个字节存储。

UTF-32

UTF-8至少使用1个字节,UTF-16至少使用2个字节。

UTF-32始终使用4个字节,而没有针对空间使用进行优化,因此浪费了很多带宽。

此约束使操作更加快捷,因为您无需检查,因为您可以假设所有字符为4个字节。

它不如UTF-8和UTF-16流行,但它有其应用程序。

免费下载我的JavaScript初学者手册


更多js教程: