unicode字符编码表下载_详解字符编码(上)
作者 | 張奎
字符編碼相關問題是軟件開發過程中的常見問題,本文對字符編碼的概念進行了介紹,并針對字符編碼的常見問題給出了解釋。
字符編碼概念
下面以一個例子來引入對字符編碼的介紹,漢字“柯”采用不同編碼格式編碼的結果如下表所示:
信息:信息是用來消除隨機不確定性的東西(香農)。符號:一種有形的標識。文字:信息的一種符號載體。字符:用以表示文字的符號,比如“a”,“柯”等。字符集:所有字符的集合,比如把所有漢字放到一起,則可以稱之為“漢字字符集”。字符編碼:字符與數字的對應關系,比如我用數字 356 對應字符‘美’,則我們描述“美”的編碼為 356。編碼方式:字符編碼的一種方式。。DEMO
在我的世界中只有三個字“你,我,他”,我將這三個字組成的集合稱之為“搗蛋字符集”,下面來給“搗蛋字符集”編碼,編碼可以有很多的方式:方法 1:1->‘我’,2->‘你’,3->‘他’方法 2:1->‘他’,2->‘你’,3->‘我’方法 3:1->‘你’,2->‘我’,3->‘他’并且,我給方法 1 取個名字叫“順序碼”,方法 2 叫“逆序碼”,方法 3 叫“亂序碼”。
區位碼
字符編碼方式的名字。和上面提到的“順序碼”,“逆序碼”,“亂序碼”一樣,是一種編碼方式的名字。
來由:可能是為了方便技術交流。
作用:給編碼方式命名。
可見區位碼在程序員眼中幾乎一無是處,可以忽略不計。
交換碼
用于在不同系統之間進行交換的編碼。
來由:不同的系統之間可能使用不同的機內碼,所以會導致亂碼問題,所以定了一種在不同系統之間一樣的編碼。
作用:不同系統之間編碼的統一接口,解決亂碼問題。
機內碼
計算機內部存儲使用的編碼。
來由:可能是程序員為了分層,自己系統內部使用的一種編碼方式,用來屏蔽掉交換碼的變動對系統的影響。
作用:計算機內部用于將編碼映射到字符。
為了方便起見,許多系統的機內碼直接使用交換碼,如 ASCII, utf8, utf16, utf32, Unicode 等,所以這些編碼的機內碼和交換碼一樣。(GB2312 的機內碼和交換碼不一樣)
其實,現代常見的系統(Windows, Mac, Linux)都采用 Unicode 作為內碼。
需要注意的是“內碼”并不是操作系統層面的東西,只是軟件層面的東西,比如我自己寫個軟件,軟件中字符的存儲采用我自己的編碼,因此我自己的軟件就有了自己的內碼。
Unicode 編碼
我們通常說的 Unicode 編碼,比如 U+4E00 其實叫做碼位/碼點(Code Point),這個是一種編碼的方式,和 GB2312 的區位碼一樣。從這個意義上來講 U+4E00 不是機內碼。只是有些機內碼使用和碼點一樣的數字來存儲 Unicode 字符。
Unicode 的碼點空間從 U+0000 到 U+10FFFF,共約 111 萬個碼點可用來映射字符。
Unicode 的碼點空間被分為 17 個 plane,每個平面有 0xFFFF 個碼位。
第一個 Unicode 平面,碼位從 U+0000 到 U+FFFF 包含了最常用的字符,該平面被稱為“基本多語言平面(BMP = Basic Multilingual Plane)”。其他平面被稱為輔助(S=Supplementary)平面。見下圖:
常用中文編碼方式特點:GB2312 的編碼規則
GB2312 采用區位碼的方式進行編碼的。96*96 = 共 96 個區,每個區有 96 個位置。
編碼規則為:區/位碼分別加上 32(0010 0000)產生交換碼,用于國際交換,然后高位置1得到機內碼,用于存儲。
UTF8 的編碼規則字符編碼相關問題
1. 有了交換碼,為什么還會有亂碼問題?
答:因為各軟件/系統所用的交換碼不一致。
2. Windows 記事本將文本用 Unicode 保存,為什么會在文件開頭添加“FFFE”或“FEFF”?答:為了區分 big-endian 和 little-endian 。FEFF 是 Unicode 里的一個合法字符(utf8 編碼 EFBBBF),該字符沒有寬度,也不會導致換行(ZERO WIDTH NO-BREAK SPACE),而且存儲該字符還有一個好處,就是可以區分 big-endian 和 little-endian。因為 FFFE 不是 Unicode 的合法字符。這一做法并非是 Windows 記事本故意的,而是在 Unicode 規范中定義的。
3. 字符集和字符編碼是一一對應的么?答:不是。如下圖:
可見,知道了字符集不一定知道編碼方式,但知道了編碼方式則也就知道了字符集。
4. utf8, utf16, utf32 有什么異同?相同點:表示的范圍相同,都是整個 Unicode 字符集范圍。異同點:utf8 : 變長 1-4 字節utf16 : 變長 2 或 4 字節utf32 : 定長 4 字節(gb2312 : 定長 2 字節)
5. UCS-2 是什么?UCS-2 是早期的 Unicode 字符集的一種編碼方式,由于當時 Unicode 字符集只有目前的第一平面,故 UCS-2 使用定長 2 字節的長度來編碼 Unicode 字符集。其編碼的方式和 Unicode 字符的碼位一致。
6. utf16 和 UCS-2 的異同?utf16 包含 ucs-2 的字符,只是 utf16 是動態的編碼,在 Unicode 第一平面內,其兩者編碼結果相同。(都是以 Unicode 的碼位作為編碼)
7. 如果 Unicode 只是一個字符集的話,為什么它常常和 utf8 放在一起?比如在記事本的另存里面:
答:這是一種落后的使用方法,和 Unicode 的歷史有關。
早期的 Unicode 字符集只有一種編碼方式 UCS-2,由于只有一種所以就直接稱為“Unicode 編碼(橙色)”,所以有些程序沿用以前的叫法,把 Unicode 編碼和 utf8 放在一起,一般這種情況下的 Unicode 編碼指的就是 UTF-16。
其實,記事本中的 Unicode 就是 utf16。
8. 什么是帶 BOM 的 UTF-8?BOM = Byte Order Mark , 字節碼序標記,即字符 U+FEFF ,是 Unicode 標準定義的一種用于 表示字節碼順序 的字符。是 Unicode 標準專為 UTF16 和 UTF32 設計的(標準也允許 UTF8 使用 BOM),UTF8 由于是單字節的編碼方式,所以不存在big-endian和little-endian的問題,所以 UTF8 其實并不需要這個東西,但微軟的記事本為了統一或者為了和其他編碼方式區分開,會自動在 UTF8 前加上 BOM,這有可能導致在 linux,mac 等系統下亂碼。所以網頁(要跨平臺)一般不要使用帶 BOM 的 UTF8。帶 BOM 的編碼,指的就是文件頭帶有 U+FEFF 字符。
Notepad++ 里的顯示:
總結
本文主要是介紹了一些字符編碼理論相關的內容,沒有涉及到實際應用,接下來的一篇文章將結合具體開發過程相關的字符編碼問題進行詳細介紹。
總結
以上是生活随笔為你收集整理的unicode字符编码表下载_详解字符编码(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python下载网页中的pdf文件_【P
- 下一篇: python动态图片转字符画_GIF动态