雖然從事多年程式設計,之前一直在國外專案,近一年接收國內專案,對中文的支援成為必要的需求,之前遇到亂碼的問題,都是網上找解決方案,沒有從根本上理解這個事情,抽出時間理解一下相關底層的處理邏輯,相關知識點在此處記錄。
utf-8(8 位元,universal character set/unicode transformation format)是針對 unicode 的一種可變長度字元編碼。它可以用來表示 unicode 標準中的任何字元,而且其編碼中的第乙個位元組仍與 ascii 相容,使得原來處理 ascii 字元的軟體無須或只進行少部份修改後,便可繼續使用。因此,它逐漸成為電子郵件、網頁及其他儲存或傳送文字的應用中,優先採用的編碼。
摘要自維基百科:
utf-8(8-bit unicode transformation format)是一種針對 unicode 的可變長度字元編碼,也是一種字首碼。它可以用一至四個位元組對 unicode 字符集中的所有有效編碼點進行編碼,屬於 unicode 標準的一部分,最初由肯·湯普遜和羅布·派克提出。由於較小值的編碼點一般使用頻率較高,直接使用 unicode 編碼效率低下,大量浪費記憶體空間。utf-8 就是為了解決向後相容 ascii 碼而設計,unicode 中前 128 個字元,使用與 ascii 碼相同的二進位制值的單個位元組進行編碼,而且字面與 ascii 碼的字面一一對應,這使得原來處理 ascii 字元的軟體無須或只須做少部分修改,即可繼續使用。因此,它逐漸成為電子郵件、網頁及其他儲存或傳送文字優先採用的編碼方式。
劃重點:
引出問題:
ucs 字元 u+0000 到 u+007f(ascii)被編碼為位元組 0×00 到 0x7f(asciⅱ 相容)。這意味著只包含 7 位 ascil 字元的檔案在 asciⅱ 和 utf-8 兩種編碼方式下是一樣的。
所有大於 0x007f 的 ucs 字元被編碼為乙個有多個位元組的串,每個位元組都有標記位集。因此,ascil 位元組(0x00-0x7f)不可能作為任何其他字元的一部分。表示非 ascil 字元的多位元組串的第乙個位元組總是在 0xc0 到 0xfd 的範圍裡,並指出這個字元包含多少個位元組。多位元組串的其餘位元組都在 0x80 到 0xbf 範圍裡。這使得重新同步非常容易,並使編碼無國界,且很少受丟失位元組的影響。
utf-8 編碼字元理論上可以最多到 6 個位元組長,然而 16 位 bmp 字元最多只用到 3 位元組長,bigendian ucs-4 位元組串的排列順序是預定的,位元組 0xfe 和 oxff 在 utf-8 編碼中從未用到
摘要自維基百科:
utf-8 使用一至六個位元組為每個字元編碼(儘管如此,2003 年 11 月 utf-8 被 rfc 3629 重新規範,只能使用原來 unicode 定義的區域,u+0000 到 u+10ffff,也就是說最多四個位元組):
128 個 us-ascii 字元只需乙個位元組編碼(unicode 範圍由 u+0000 至 u+007f)。
帶有附加符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要兩個位元組編碼(unicode 範圍由 u+0080 至 u+07ff)。
其他基本多文種平面(bmp)中的字元(這包含了大部分常用字,如大部分的漢字)使用三個位元組編碼(unicode 範圍由 u+0800 至 u+ffff)。
其他極少使用的 unicode 輔助平面的字元使用四至六位元組編碼(unicode 範圍由 u+10000 至 u+1fffff 使用四位元組,unicode 範圍由 u+200000 至 u+3ffffff 使用五位元組,unicode 範圍由 u+4000000 至 u+7fffffff 使用六位元組)。
對上述提及的第四種字元而言,utf-8 使用四至六個位元組來編碼似乎太耗費資源了。但 utf-8 對所有常用的字元都可以用三個位元組表示,而且它的另一種選擇,utf-16 編碼,對前述的第四種字元同樣需要四個位元組來編碼,所以要決定 utf-8 或 utf-16 哪種編碼比較有效率,還要視所使用的字元的分布範圍而定。不過,如果使用一些傳統的壓縮系統,比如 deflate,則這些不同編碼系統間的的差異就變得微不足道了。若顧及傳統壓縮演算法在壓縮較短文本上的效果不大,可以考慮使用 unicode 標準壓縮格式(scsu)。
劃重點:
0b0zzzzzzz 表示由1個位元組組成的字元,剩餘7位使用者表示字元值(即單位元組ascii碼)
0b110yyyyy 表示由2個位元組組成的字元,剩餘6位使用者表示字元值
0b1110***x 表示由3個位元組組成的字元,剩餘5位使用者表示字元值
0b11110www 表示由4個位元組組成的字元,剩餘4位使用者表示字元值
首位元組
首位元組值區間
位元組數0b0zzzzzzz
0x00~0x7f < 0x8f
1
0b110yyyyy
0x8f~0xdf < 0xe0
2
0b1110***x
0xe0~0xef < 0xf0
3
0b11110www
0xf0~0xf7 < 0xf8
4
位元組數位元組 1
位元組 2
位元組 3
位元組 4
有效字元值位數
字元值字元值區間
10b0zzzzzzz
---
7 = 7
0bzzzzzzz
0x00~0x7f < 0x8f
20b110yyyyy
0b10zzzzzz
-
-5 + 6 = 11
0byyyyyzzzzzz
0x8f~0x7ff < 0x800
30b1110***x
0b10yyyyyy
0b10zzzzzz
-
4 + 6 + 6 = 16
0b***xyyyyyyzzzzzz
0x800~0xffff < 0x10000
40b11110www
0b10******
0b10yyyyyy
0b10zzzzzz
3 + 6 + 6 + 6 = 21
0bwww******yyyyyyzzzzzz
0x10000~0x1fffff < 0x200000
網頁utf 8亂碼 utf8亂碼
複製 在前 在windows作業系統上使用ie作為瀏覽器時。常常會發生這樣的問題 在瀏覽使用utf 8編碼的網頁時,瀏覽器無法自動偵測 即沒有設定 自動選擇 編碼格式時 該頁面所用的編碼。即使網頁已經宣告過編碼格式 由此造成某些含有中文utf 8編碼的頁面產生空白輸出。由於utf 8為3個位元組表示...
utf 8 和 utf8的區別小記
utf 8 是標準寫法,php 在 windows 下邊英文不區分大小寫,所以也可以寫成 utf 8 utf 8 也可以把中間的 省略,寫成 utf8 一般程式都能識別,但也有例外 如下文 為了嚴格一點,最好用標準的大寫 utf 8 在資料庫中只能使用 utf8 mysql 在mysql的命令模式中...
utf8 和 UTF 8 有什麼區別
utf 8 是標準寫法,在windows下邊英文不區分大小寫,所以也可以寫成 utf 8 utf 8 也可以把中間的 省略,寫成 utf8 一般程式都能識別,但也有例外 如下文 為了嚴格一點,最好用標準的大寫 utf 8 在mysql資料庫中只能使用 utf8 在mysql的命令模式中只能使用 ut...