一文讀懂字符與編碼
完整內容也可以在公眾號「非專業程序員Ping」查看
一、字符/Character
對用戶可見的“一個字符”,通常是我們在屏幕上看到的一個字母、數字、emoji 或組合字符。
比如:a、é、???????????
二、字符編碼標準/字符集
字符編碼標準定義的是如何將字符映射到唯一編碼,常見的字符編碼標準比如ASCII、Unicode、GBK等
2.1 ASCII
ASCII(7位)定義了 128 個字符的唯一編碼,包括數字0到9、小寫字母a到z、大寫字母A到Z以及常用標點符號等。
2.2 Unicode
Unicode又叫萬國碼,目標是為所有字符定義唯一編碼(Code Point)。為了解決ASCII/GBK不能定義全部字符的問題。
比如:
a -> U+0061
?? -> U+1F468
注意:
Unicode只負責分配碼位(Code Point),并不決定具體的存儲形式。
Unicode的前 128 個碼點與ASCII相同。
2.2.1 Code Point
Code Point也叫碼位,Unicode中為每個字符分配的唯一編碼。
一個字符可以對應一個或多個Code Point,比如:
a:U+0061,對應 1 個Code Point???????????:U+1F468 (??) + U+200D (ZWJ) + U+1F469 (??) + U+200D (ZWJ) + U+1F467 (??) + U+200D (ZWJ) + U+1F466 (??)對應 7 個Code Pointé:U+00E9或U+0065 + U+0301
備注:
在Unicode中,
é實際上有兩種表示方式:單一字符表示法:即直接使用
U+00E9這個單獨的Unicode碼位表示é。組合字符表示法:使用
U+0065(字母e)和U+0301(重音符號)兩個Unicode碼位來表示一個é字符。為什么會有這兩種表示法?
歷史原因:Unicode設計時考慮到了不同語言的需求,許多語言(如法語、西班牙語等)使用帶有重音符號的字符,因此,Unicode同時支持這兩種表示方式。
兼容性:一些舊的系統或字體可能只支持分解字符表示法,因此,Unicode也保留了這種組合字符的方式,以提高兼容性。
2.2.2 Code Unit
Code Unit也叫碼元(代碼單元),表示計算機中實際存儲Unicode的基本單位,取決于編碼方式。
比如:
-
UTF-8:Code Unit是 1 字節(8 Bit);比如:a在UTF-8編碼下占 1 個字節,表示為0x61。 -
UTF-16:Code Unit是 2 字節(16 Bit);比如:a在UTF-16編碼下占 2 個字節,表示為0x0061。 -
UTF-32:Code Unit是 4 字節(32 Bit);比如:a在UTF-32編碼下占 4 個字節,表示為0x00000061。
三、字符編碼方式
字符編碼方式決定了字符如何存儲、傳輸和解碼;常見的編碼方式有:UTF-8、UTF-16、UTF-32等
-
UTF-8:可變長度,用 1 到 4 個字節來存儲 Unicode 字符;為了節省存儲資源。 -
UTF-16:可變長度,用 2 或 4 個字節存儲字符。 -
UTF-32:固定長度,每個字符始終使用 4 字節存儲。
比如:
é的Code Point是:U+0065 + U+0301
當以UTF-32方式編碼時,每個Code Point未超過4字節,所以表示為:0x00000065,0x00000301
當以UTF-16方式編碼時,每個Code Point未超過2字節,所以表示為:0x0065,0x0301
當以UTF-8方式編碼時,0x0301值超過了128,需要按UTF-8格式拆分為0xCC,0x81,所以表示為:0x65,0xCC,0x81
Q:
UTF-8編碼為什么是按128做比較,按理說1字節(0xFF)表示的最大值是255?A:有兩個原因:一是為了與
ASCII兼容,ASCII只支持了128個字符編碼,在UTF-8編碼中,前128位與ASCII編碼相同;二是UTF-8編碼中,會將第一個字節的高位部分用來標識這個字符的編碼長度,具體為:
0xxxxxxx:表示 1 字節字符(ASCII范圍)
110xxxxx:表示 2 字節字符
1110xxxx:表示 3 字節字符
11110xxx:表示 4 字節字符
歡迎關注同名公眾號:非專業程序員Ping
posted on 2025-10-21 00:38 非專業程序員Ping 閱讀(129) 評論(0) 收藏 舉報

浙公網安備 33010602011771號