字符編碼筆記:ASCII,Unicode 和 UTF-8(理解)
- 一、ASCII 碼
- 美國製定的字符編碼規則,對英語字符與二進制位之間的關係作了統一規定。
- 佔一個字節,8 位,最多可表示 2^8 = 256 種狀態(字符)
- 實際共有 128 個字符,只佔用一個字節的後面 7 位。首位統一規定爲 0。
- 二、非 ASCII 編碼
- 其餘國家各自制定的編碼規則。映射本國字符和二進制之間的關係。
- 其餘國家(字符數 > 256),則有本身的編碼規則。好比中文的:GB2312
- 三、Unicode
- 容納世界上全部符號的符號集。每一個符號都有本身的二進制代碼。
- 只是一個符號集,只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。
- 好比:英文字符所有可用 1 個字節表示,可是漢字可能須要 2 或 3 個字節。一種編碼格式所有都用2個或者3個字節表示會有浪費。因此該如何存儲呢?
- 四、UTF-8
- 一、概念:
- 互聯網上使用最廣的一種 Unicode 的實現方式。(Unicode 也有其餘實現方式)
- 二、特色:
- 變長的編碼方式。它可使用 1~4 個字節表示一個符號,根據不一樣的符號而變化字節長度。
- 三、編碼規則:
- 1)對於單字節的符號,字節的第一位設爲 0,後面 7 位爲這個符號的 Unicode 碼。
- 所以對於英語字母,UTF-8 編碼和 ASCII 碼是相同的。
- 2)對於 n 字節的符號(n > 1),第一個字節的前 n 位都設爲 1,第 n + 1 位設爲 0,後面字節的前兩位一概設爲 10。
- 剩下的沒有說起的二進制位,所有爲這個符號的 Unicode 碼。
- 四、Unicode 和 UTF-8的對應關係()
- 4.1 關係圖:
- 圖:
- 說明:
- 總感受這個圖不理解,不過仍是作一些解讀和說明吧。
- 第一行:
- 字符最多佔7位(0-7位)
- 因此:Unicode 符號範圍:0(十六進制:0)-111 1111(十六進制:7F)
- 第二行:
- 字符最多佔11位(8-11位)
- Unicode 符號範圍:1000 0000(十六進制:80)-111 1111 1111(十六進制:7FF)
- 第三行:
- 字符最多佔16位(12-16位)
- Unicode 符號範圍:1000 0000 0000(十六進制:800)-111 1111 1111(十六進制:7FF)
- 第四行:
- 4.2 轉換:
- Unicode 和 UTF-8都用16位表示,須要從中提取出來具體的值,而後轉換。
- Unicode 到 UTF-8 的轉換
- 根據Unicode 的值,肯定其符號範圍對應的 UTF-8 是多少位。而後,高位補0填充。
- UTF-8 提取 Unicode
- 五、編碼存儲方式:Little endian 和 Big endian
- 5.1 概念理解
- 以漢字嚴爲例,Unicode 碼是 4E25,須要用兩個字節存儲,一個字節是 4E,另外一個字節是 25。
- 存儲時,4E 在前,25 在後,這就是 Big endian 方式;
- 25 在前,4E 在後,這是 Little endian 方式。
- 即:通常文本都是從左往右的格式。
- 若是編碼從左往右存:是 Big endian 方式(高位在前,FE FF 表示)
- 若是編碼從右往左存:是 Little endian 方式(高位在後,FF FE 表示)
- 5.2 區分:
- Unicode 規範定義,每一個文件的最前面分別加入一個表示編碼順序的字符,這個字符的名字叫作 "零寬度非換行空格"(zero width no-break space),用 FEFF 表示。這正好是兩個字節,並且 FF 比 FE 大 1。
- 若是一個文本文件的頭兩個字節是 FE FF,就表示該文件採用大頭方式(左小右大);
- 若是頭兩個字節是 FF FE,就表示該文件採用小頭方式(左大右小)。
- 六、參考:
歡迎關注本站公眾號,獲取更多信息