UTF-8 可变编码格式
因為網(wǎng)絡(luò)中大部分的字符是ASCII碼字符,UTF-8可以用一個字節(jié)表示ASCII字符,相較于UTF-16和UTF-32的兩個字節(jié)或者四個字節(jié),大幅節(jié)省了空間和傳輸帶寬.
?
幾個UTF-8的編碼例子 (由該網(wǎng)頁工具轉(zhuǎn)換?https://sites.google.com/site/nathanlexwww/tools/utf8-convert?)
?
字符 ? ? ? ? ? ?UTF-8編碼 ? ?Byte 1 ? ? ? ? ? ? ? ? ? Byte 2 ? ? ? ? ? ? Byte 3
A ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 01000001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?11000011 ? ? ? ? ? ?10010110 ? ? ??
中 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 11100100 ? ? ? ? ? ?10111000 ? ? ?10101101
?
Note: ? Byte 1 中開頭"1"的個數(shù)就是整個?UTF-8編碼中字節(jié)的數(shù)目(只適用于長度大于等于兩個字節(jié)的UTF編碼,表示ASCII編碼的UTF首字節(jié)的首位是0)
?
?
#以下內(nèi)容部分來自wiki,部分來自stackoverflow.
?
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,也是一種前綴碼。它可以用來表示Unicode標準中的任何字符,且其編碼中的第一個字節(jié)仍與ASCII兼容,這使得原來處理ASCII字符的軟件無須或只須做少部分修改,即可繼續(xù)使用。因此,它逐漸成為電子郵件、網(wǎng)頁及其他存儲或發(fā)送文字的應(yīng)用中,優(yōu)先采用的編碼。
UTF-8使用一至六個字節(jié)為每個字符編碼(盡管如此,2003年11月UTF-8被RFC 3629重新規(guī)范,只能使用原來Unicode定義的區(qū)域,U+0000到U+10FFFF,也就是說最多四個字節(jié)):
?
? Binary ? ?Hex ? ? ? ? ? ? ? ? Comments
0xxxxxxx ?0x00..0x7F ? Only byte of a 1-byte character encoding
10xxxxxx ?0x80..0xBF ? Continuation bytes (1-3 continuation bytes)
110xxxxx ?0xC0..0xDF ? First byte of a 2-byte character encoding
1110xxxx ?0xE0..0xEF ? First byte of a 3-byte character encoding
11110xxx ?0xF0..0xF7 ? First byte of a 4-byte character encoding
??
??
對于UTF-8編碼中的任意字節(jié)X,如果X的第一位為0,則X獨立的表示一個字符(ASCII碼)
如果X的第一位為1,第二位為0,則X為一個多字節(jié)字符中的后續(xù)字節(jié)(非第一字節(jié))
如果X的前兩位為1,第三位為0,則X為兩個字節(jié)表示的字符中的第一個字節(jié)
如果X的前三位為1,第四位為0,則X為三個字節(jié)表示的字符中的第一個字節(jié)
如果X的前四位為1,第五位為0,則X為四個字節(jié)表示的字符中的第一個字節(jié)
?
?
| U+0000 | U+007F | 1 | 0xxxxxxx | |||||
| U+0080 | U+07FF | 2 | 110xxxxx | 10xxxxxx | ||||
| U+0800 | U+FFFF | 3 | 1110xxxx | 10xxxxxx | 10xxxxxx | |||
| U+10000 | U+1FFFFF | 4 | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | ||
| U+200000 | U+3FFFFFF | 5 | 111110xx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | |
| U+4000000 | U+7FFFFFFF | 6 | 1111110x | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
?
- 在ASCII碼的范圍,用一個字節(jié)表示,超出ASCII碼的范圍就用字節(jié)表示,這就形成了我們上面看到的UTF-8的表示方法,這様?shù)暮锰幨钱擴NICODE文件中只有ASCII碼時,存儲的文件都為一個字節(jié),所以就是普通的ASCII文件無異,讀取的時候也是如此,所以能與以前的ASCII文件兼容。
- 大于ASCII碼的,就會由上面的第一字節(jié)的前幾位表示該unicode字符的長度,比如110xxxxx前三位的二進制表示告訴我們這是個2BYTE的UNICODE字符;1110xxxx是個三位的UNICODE字符,依此類推;xxx的位置由字符編碼數(shù)的二進制表示的位填入。越靠右的x具有越少的特殊意義。只用最短的那個足夠表達一個字符編碼數(shù)的多字節(jié)串。注意在多字節(jié)串中,第一個字節(jié)的開頭"1"的數(shù)目就是整個串中字節(jié)的數(shù)目。
?
Some useful links:
http://www.unicode.org/Public/9.0.0/ucd/UnicodeData.txt
http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=bin
?
##博客僅作個人記錄##
轉(zhuǎn)載于:https://www.cnblogs.com/paulbai/p/6586941.html
總結(jié)
以上是生活随笔為你收集整理的UTF-8 可变编码格式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arduino MEGA 2560找不到
- 下一篇: Linux下python安装升级详细步骤