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教程: