J2EE社區

          茍有恒,何必三更起五更眠;
          最無益,只怕一日曝十日寒.
          posts - 241, comments - 318, trackbacks - 0, articles - 16

           

               最近老為編碼問題而煩燥,下定決心一定要將其弄明白!本文主要總結網上一些朋友提供的 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個字節統一進行編碼。可能你會問,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了。




          名稱: ?4C.ESL | .↗Evon
          口號: 遇到新問題?先要尋找一個方案乄而不是創造一個方案こ
          mail: 聯系我


          主站蜘蛛池模板: 徐汇区| 山阳县| 五莲县| 江源县| 察哈| 上蔡县| 麻阳| 兰溪市| 正阳县| 开江县| 八宿县| 丹凤县| 崇阳县| 大足县| 金平| 永登县| 马山县| 凤城市| 通州区| 五华县| 诏安县| 佳木斯市| 额济纳旗| 沧源| 南宁市| 白城市| 康定县| 奈曼旗| 长宁县| 库尔勒市| 宜宾市| 阿图什市| 长乐市| 宾川县| 象山县| 老河口市| 崇州市| 靖西县| 炉霍县| 璧山县| 昌宁县|