ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别
?
???? 最近老為編碼問題而煩燥,下定決心一定要將其弄明白!本文主要總 結網上一些朋友提供的 ascii,ISO-8859-1,unicode, utf8,gb2312,big5,gbk,gb18030等幾種常區別.
????
1. ASCII碼
????目前計算機中用得最廣泛的字符集及其編碼,是由美國國家標準局 (ANSI)制定的ASCII碼(American Standard Code for Information Interchange,美國標準信息交換碼),它已被國際標準化組織(ISO)定為國際標準,稱為ISO 646標準。適用于所有拉丁文字字母,ASCII碼有7位碼和8位碼兩種形式。
??? ?我們知道,在計算機內部,所有的信息最終都表示為一個二進制的字 符串。每一個二進制位(bit)有0和1兩種狀態,因此八個二進制位就可以組合出256種狀態,這被稱為一個字節(byte)。也就是說,一個字節一共可 以用來表示256種不同的狀態,每一個狀態對應一個符號,就是256個符號,從0000000到11111111。
ASCII表
| ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
| 0 | NUL | 32 | (space) | 64 | @ | 96 | 、 |
| 1 | SOH | 33 | ! | 65 | A | 97 | a |
| 2 | STX | 34 | ” | 66 | B | 98 | b |
| 3 | ETX | 35 | # | 67 | C | 99 | c |
| 4 | EOT | 36 | $ | 68 | D | 100 | d |
| 5 | ENQ | 37 | % | 69 | E | 101 | e |
| 6 | ACK | 38 | & | 70 | F | 102 | f |
| 7 | BEL | 39 | , | 71 | G | 103 | g |
| 8 | BS | 40 | ( | 72 | H | 104 | h |
| 9 | HT | 41 | ) | 73 | I | 105 | i |
| 10 | LF | 42 | * | 74 | J | 106 | j |
| 11 | VT | 43 | + | 75 | K | 107 | k |
| 12 | FF | 44 | , | 76 | L | 108 | l |
| 13 | CR | 45 | - | 77 | M | 109 | m |
| 14 | SO | 46 | . | 78 | N | 110 | n |
| 15 | SI | 47 | / | 79 | O | 111 | o |
| 16 | DLE | 48 | 0 | 80 | P | 112 | p |
| 17 | DCI | 49 | 1 | 81 | Q | 113 | q |
| 18 | DC2 | 50 | 2 | 82 | R | 114 | r |
| 19 | DC3 | 51 | 3 | 83 | X | 115 | s |
| 20 | DC4 | 52 | 4 | 84 | T | 116 | t |
| 21 | NAK | 53 | 5 | 85 | U | 117 | u |
| 22 | SYN | 54 | 6 | 86 | V | 118 | v |
| 23 | TB | 55 | 7 | 87 | W | 119 | w |
| 24 | CAN | 56 | 8 | 88 | X | 120 | x |
| 25 | EM | 57 | 9 | 89 | Y | 121 | y |
| 26 | SUB | 58 | : | 90 | Z | 122 | z |
| 27 | ESC | 59 | ; | 91 | [ | 123 | { |
| 28 | FS | 60 | <? | 92 | " | 124 | | |
| 29 | GS | 61 | = | 93 | ] | 125 | } |
| 30 | RS | 62 | >? | 94 | ^ | 126 | ~ |
| 31 | US | 63 | ? | 95 | — | 127 | DEL |
| NUL 空字符(Null) | VT 垂直制表 | SYN 空轉同步 |
| SOH? 標題開始 | FF?? 走紙控制 | ETB? 信息組傳送結束 |
| STX? 正文開始 | CR?? 回車 | CAN? 作廢 |
| ETX? 正文結束 | SO?? 移位輸出 | EM?? 紙盡 |
| EOY? 傳輸結束 | SI??? 移位輸入 | SUB? 換置 |
| ENQ? 詢問字符 | DLE? 空格 | ESC? 換碼 |
| ACK? 承認 | DC1? 設備控制1 | FS?? 文字分隔符 |
| BEL? 報警 | DC2? 設備控制2 | GS?? 組分隔符 |
| BS?? 退一格 | DC3? 設備控制3 | RS?? 記錄分隔符 |
| HT?? 橫向列表 | DC4? 設備控制4 | US?? 單元分隔符 |
| LF?? 換行 | NAK? 否定 | DEL? 刪除 |
英語用128個符號編碼 就夠了,但是用來表示其他語言,128個符號是不夠的。比如,在法語中,字母上方有注音符號,它就無法用ASCII碼表示。于是,一些歐洲國家就決定,利 用字節中閑置的最高位編入新的符號。比如,法語中的é的編碼為130(二進制10000010)。這樣一來,這些歐洲國家使用的編碼體系,可以表示最多 256個符號。
但是,這里又出現了新的 問題。不同的國家有不同的字母,因此,哪怕它們都使用256個符號的編碼方式,代表的字母卻不一樣。比如,130在法語編碼中代表了é,在希伯來語編碼中 卻代表了字母Gimel (?),在俄語編碼中又會 代表另一個符號。但是不管怎樣,所有這些編碼方式中,0—127表示的符號是一樣的,不一樣的只是128—255的這一段,所以出現后面的統一編碼方式。
注:
若想得到更詳細的參見 http://ascii.911cha.com/
2、各地的方言
在中國,大陸最常用的就 是GBK18030編碼,除此之外還有GBK,GB2312,這幾個編碼的關系是這樣的。
字符必須編碼后才能被計 算機處理。計算機使用的缺省編碼方式就是計算機的內碼。早期的計算機使用7位的ASCII編碼,但為了處理漢字,又設計出用于簡體中文的GB2312和用 于繁體中文的big5。
GB2312(1980年)一共收錄了7445個字符,包括6763個漢字和682個 其它符號。漢字區的內碼范圍高字節從B0-F7,低字節從A1-FE,占用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。
GB2312支持的漢字太少。1995年的漢字擴展規范GBK1.0收錄了 21886個符號,它分為漢字區和圖形符號區。漢字區包括21003個字符。
從ASCII、 GB2312到GBK,這些編碼方法是向下兼容的,即同一個字符在這些方案中總是有相同的編碼,后面的標準支持更多的字符。在這些編碼中,英文和中文可以 統一地處理。區分中文編碼的方法是高字節的最高位不為0。按照程序員的稱呼,GB2312、GBK都屬于雙字節字符集 (DBCS)。
2000年的GB18030是取代GBK1.0的正式國家標準。該標準 收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。從漢字字匯上說,GB18030在GB13000.1的20902個漢 字的基礎上增加了CJK擴展A的6582個漢字(Unicode碼0x3400-0x4db5),一共收錄了27484個漢字。
CJK就是中日韓的意思。Unicode為了節省碼位,將中日韓三國 語言中的文字統一編碼。GB13000.1就是ISO/IEC 10646-1的中文版,相當于Unicode 1.1。
GB18030的編碼采用單字節、雙字節和4字節方案。其中單字節、雙字節和 GBK是完全兼容的。4字節編碼的碼位就是收錄了CJK擴展A的6582個漢字。例如:UCS的0x3400在GB18030中的編碼應該是 8139EF30,UCS的0x3401在GB18030中的編碼應該是8139EF31。
微軟提供了 GB18030的升級包,但這個升級包只是提供了一套支持CJK擴展A的6582個漢字的新字體:新宋體-18030,并不改變內碼。Windows 的內碼仍然是GBK。
也就是 說Big5支持繁體中文,GB2312支持簡體中文,Big5,GB2312是GBK的子集,GBK是GB18030的子集
日本:SJIS編碼
注:
漢字編碼簡明對照表 http://www.knowsky.com/resource/gb2312tbm.htm
3、Unicode
如果把各種文字編碼形容 為各地的方言,那么Unicode就是世界各國合作開發的一種語言。
在這種語言環境下,不會 再有語言的編碼沖突,在同屏下,可以顯示任何語言的內容,這就是Unicode的最大好處。
那么Unicode是如 何編碼的呢?其實非常簡單。
就是將世界上所有的文字 用2個字節統一進行編碼??赡苣銜?#xff0c;2個字節最多能夠表示65536個編碼,夠用嗎?
Unicode的學名是"Universal Multiple-Octet Coded Character Set",簡稱為UCS。現在用的是UCS-2,即2個字節編碼.
以現在的發展肯定是不夠 用得,如《康熙字典》收錄了四萬七千零三十五字,《漢語大字典》收錄了五萬六千多個。到目前為止,國際標準組織(ISO)制定國際標準時,共收集到漢字七 萬多字,所以出現UCS-4, 即4個字節編碼,由原先的65536個編碼擴展至將近100萬編碼。
注:
中日韓漢字 Unicode編碼表:http://www.chi2ko.com/tool/CJK.htm
查詢需要Unicode 編碼的字符:
http://www.unicode.org/charts/unihan.html
http://www.nengcha.com/code/unicode/
4、兼容codepage
那么既然統一了編碼,如 何兼容原先各國的文字編碼呢?這個時候就需要codepage了。
什么是codepage?codepage 就是各國的文字編碼和Unicode之間的映射表。比如簡體中文和Unicode的映射表就是CP936,點這里查看官方的映射表。
以下是幾個常用的codepage,相應的修改上面的地址的數字即可。
codepage=936 簡體中文GBK
codepage=950 繁體中文BIG5
codepage=437 美國/加拿大英語
codepage=932 日文
codepage=949 韓文
codepage=866 俄文
codepage=65001 unicode UFT-8
從936中隨意取一行, 例如:0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH.前面的編碼是GBK的編碼,后面的是Unicode。通過查這張表,就能簡單的實現GBK和Unicode之間的轉換
5、UTF-8
現在明白了 Unicode,那么UTF-8又是什么呢?又為什么會出現UTF-8呢?
Unicode的最初目標,是用1個16位的編碼來為超過65000字符提供 映射。但這還不夠,它不能覆蓋全部歷史上的文字,也不能解決傳輸的問題,尤其在那些基于網絡的應用中。?
?因此,Unicode用一些基本的保留字符制定了三套編碼方 式。它們分別是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列來編碼的,用一個或幾個字節來表示一個字符。這 種方式的最大好處,是UTF-8保留了ASCII字符的編碼做為它的一部分,例如,在UTF-8和ASCII中,“A”的編碼都是0x41.?
例:11100100 10111101 10100000à0xE4BDA0 “你”字的UTF-8編碼
01001111 01100000????????à0x4F60??“你”的Unicode編碼
按照UTF-8的編碼規 則,11100100 10111101 10100000分解如下:xxxx0100 xx111101 xx100000,把除了x之外的數字拼接在一起,01001111 01100000就變成“你”的Unicode編碼了.注意UTF-8的最前面3個1,表示整個UTF-8串是由3個字節構成的經過UTF-8編碼之后, 再也不會出現敏感字符了,因為最高位始終為1。
Unicode和UTF-8之間的轉換關系表:
0000 0000-0000 007F | 0xxxxxxx
0000 0000-0080 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx???
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Unicode編碼轉換到UTF-8,簡單的把Unicode字節流套到x中 就變成UTF-8了。
轉載于:https://www.cnblogs.com/bestdqf/archive/2010/06/26/1765767.html
總結
以上是生活随笔為你收集整理的ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查询优化(2)
- 下一篇: PB_Truncate函数截取小数点引起