Unicode、UTF-8、Big Endian、Little Endian、GBK、UCS-2
生活随笔
收集整理的這篇文章主要介紹了
Unicode、UTF-8、Big Endian、Little Endian、GBK、UCS-2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Unicode、UTF-8、Big Endian、Little Endian、GBK、UCS-2
編碼字符集(Coded character set):是一組字符對應的編碼(即數字),為字符集合中的每一個字符給予一個數字。例如最早的編碼字符集ASCII,和后來的unicode(持續更新中)。由于編碼字符集為每一個字符賦予一個數字,因此,字符可以認為就是一個16位的數字,因此以下方式都可以給字符賦值: char c=‘中’ char c =0x4e2d char c=20013 字符編碼方案(Character-encoding schema):將字符編碼(數字)映射到一個字節數組的方案,因為在磁盤里,所有信息都是以字節的方式存儲的。因此16位字符必須轉換為一個字節數組才能夠存儲。例如UTF-8字符編碼方案,它可以將一個字符轉換為1、2、3或者4個字節。
一般認為,編碼字符集和字符編碼方案合起來被稱之為字符集(Charset),這是一個術語,要和前面的字符集合(Character set)區分開。 ?
(十六進制) | (二進制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Little-Endian就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。
Big-Endian就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。
Big Endian和Little Endian和芯片類型以及操作系統都有關系。
推薦這篇文章看一下:http://wiki.ubuntu.org.cn/index.php?title=Unicode&variant=zh-cn#.E8.B5.B7.E6.BA.90.E8.88.87.E7.99.BC.E5.B1.95 4.解決的問題:一、如何在中文系統中運行非Unicode編碼程序?
有很多意大利文版(除英文版)學習軟件、百科全書等軟件在中文系統上會出現亂碼,解決方法:
WindowsXP內核是Unicode編碼,支持多語種,對于Unicode編碼的應用程序會正常顯示原文(因為windows核心是用unicode代碼寫的,所以不存在問題),但是,很多程序不是用Unicode編碼寫的,這時WindowsXP系統可以指定以特定的編碼運行非Unicode編碼程序,中文版WindowsXP默認的是“簡體中文GB2312”。你只需在控制面板--〉區域和語言選項--〉高級--〉為非Unicode程序的語言選擇“意大利語”,即可正確運行意大利文版的游戲程序。分析:我理解的流程是這樣:程序------>意大利語編碼(轉換表codepage)------>解釋成unicode識別的編碼(通過指定的轉換表將非 Unicode 的字符編碼轉換為同一字符對應的系統內部使用的 Unicode 編碼)------>被系統翻譯成意大利文(因為每個unicode編碼對應了相應的意大利文字),便可以正常顯示了。二、消除網頁亂碼?網頁亂碼是瀏覽器對HTML網頁解釋時形成的,如果網頁制作時編碼為繁體big5,瀏覽器卻以編碼gb2312顯示該網頁,就會出現亂碼,因此只要你在瀏覽器中也以繁體big5顯示該網頁,就會消除亂碼。打個比方有些像字典,繁體字得用繁體字典來查看,簡體字得用簡體字典來查看,不然你看不懂。 【解決辦法】:在瀏覽器中選擇“編碼”菜單,事先為瀏覽器安裝多語言支持包(例如在安裝IE時要安裝多語言支持包),這樣當瀏覽網頁出現亂碼時,即可手工更改查看此網頁的編碼方式,在瀏覽器中選擇菜單欄下的“查看”/“編碼”/“自動選擇”/簡體中文(GB2312),如為繁體中文則選擇“查看”/“編碼”/“自動選擇”/繁體中文(BIG5),其他語言依此類推,便可消除網頁亂碼現象。 分析:因為繁體big5編碼后的文件,每個文字對應一個二進制流(假設是1212對應繁這個字),當我們以編碼gb2312顯示該網頁時,gb2312編碼會到表里去找1212(二進制流不會變的)對應誰,肯定不再是繁這個字了,當然顯示的就不再是那個繁字了,也就會出現亂碼了。這樣理解簡單些,其實中間還要轉換成同一字符對應的系統內部使用的 Unicode 編碼,然后通過系統底層unicode編碼還原成相應字符顯示出來。 原文地址:到底utf-8和unicode是什么關系 - - ITeye技術網站
一、Unicode、UCS、GBK
1、開始計算機只在美國用。八位的字節一共可以組合出256(2的8次方)種不同的狀態。把這些0×20以下的字節狀態稱為”控制碼”。他們又把所有的空 格、標點符號、數字、大小寫字母分別用連續的字節狀態表示,一直編到了第127號,這樣計算機就可以用不同字節來存儲英語的文字了。這個方案叫做 ANSI 的”Ascii”編碼(American Standard Code for Information Interchange,美國信息互換標準代碼)。 2、后來計算機流傳到更多西方國家,但是很多國家用的不是英文,他們的字母里有許多是ASCII里沒有的,為了可以在計算機 保存他們的文字,他們決定采用 127號之后的空位來表示這些新的字母、符號,還加入了很多畫表格時需要用下到的橫線、豎線、交叉等形狀,一直把序號編到了最后一個狀態255。從128 到255這一頁的字符集被稱”擴展字符集“。 3、等中國人們得到計算機時,已經沒有可以利用的字節狀態來表示6000多個常用漢字。 ???? 我們不客氣 地把那些127號之后的奇異符號們直接取消掉, 規定:一個小于127的字符的意義與原來相同,但兩個大于127的字符連在一起時,就表示一個漢字,前面的一個字節(他稱之為高字節)從0xA1用到 0xF7,后面一個字節(低字節)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。 ???? 在這些編碼里,我們還把數學符號、羅馬希臘的 字母、日文的假名們都編進去了,連在 ASCII 里本來就有的數字、標點、字母都統統重新編了兩個字節長的編碼,這就是常說的”全角”字符,而原來在127號以下的那些就叫”半角”字符了。 中國人民看到這樣很不錯,于是就把這種漢字方案叫做 “GB2312“。GB2312 是對 ASCII 的中文擴展。 ????? 但是中國的漢字太多了,我們很快就就發現有許多人的人名沒有辦法在這里打出來,于是我們不得不繼續把 GB2312 沒有用到的碼位找出來老實不客氣地用上。 后來還是不夠用,于是干脆不再要求低字節一定是127號之后的內碼,只要第一個字節是大于127就固定表示這是一個漢字的開始,不管后面跟的是不是擴展字 符集里的內容。結果擴展之后的編碼方案被稱為 GBK 標準,GBK包括了GB2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。 ????? 后來少數民族也要用電腦了,于是我們再擴展,又加了幾千個新的少數民族的字,GBK擴成了 GB18030。從此之后,中華民族的文化就可以在計算機時代中傳承了。 中國的程序員們看到這一系列漢字編碼的標準是好的,于是通稱他們叫做 “DBCS“(Double Byte Charecter Set 雙字節字符集)。在DBCS系列標準里,最大的特點是兩字節長的漢字字符和一字節長的英文字符并存于同一套編碼方案里,因此他們寫的程序為了支持中文處 理,必須要注意字串里的每一個字節的值,如果這個值是大于127的,那么就認為一個雙字節字符集里的字符出現了。那時候凡是受過加持,會編程的計算機僧侶 們都要每天念下面這個咒語數百遍: “一個漢字算兩個英文字符!一個漢字算兩個英文字符……” 4、問題再現:因為當時各個國家都像中國這樣搞出一套自己的編碼標準,結果互相之間誰也不懂誰的編碼,誰也不支持別人的編碼,連大陸和臺灣這樣只相隔了150海 里,使用著同一種語言的兄弟地區,也分別采用了不同的 DBCS 編碼方案——當時的中國人想讓電腦顯示漢字,就必須裝上一個”漢字系統”,專門用來處理漢字的顯示、輸入的問題,但是那個臺灣的愚昧封建人士寫的算命程序 就必須加裝另一套支持 BIG5 編碼的什么”倚天漢字系統”才可以用,裝錯了字符系統,顯示就會亂了套!這怎么辦?而且世界民族之林中還有那些一時用不上電腦的窮苦人民,他們的文字又怎 么辦? 5、一個叫 ISO (國際標誰化組織)的國際組織決定著手解決這個問題。他們采用的方法很簡單:廢了所有的地區性編碼方案,重新搞一個包括了地球上所有文化、所有字母和符號 的編碼!他們打算叫它”Universal Multiple-Octet Coded Character Set”,簡稱 UCS, 俗稱 “unicode“。那么UCS-2和UCS-4是什么意思?UCS-2是指用兩個字節對應一個字符的編碼字符集;UCS-4則是指用四個字節對應一個字符的編碼字符集。你可以認為,目前為止Unicode有兩個具體的編碼字符集,UCS-2和UCS-4。 6、問題又來了:unicode同樣也不完美,這里就有兩個的問題,一個是,如何才能區別unicode和ascii?計算機怎么知道三個字節表示一個符號,而不是 分別表示三個符號呢?第二個問題是,我們已經知道,英文字母只用一個字節表示就夠了,如果unicode統一規定,每個符號用三個或四個字節表示,那么每 個英文字母前都必然有二到三個字節是0,這對于存儲空間來說是極大的浪費,文本文件的大小會因此大出二三倍,這是難以接受的。 7、unicode在很長一段時間內無法推廣,直到互聯網的出現,為解決unicode如何在網絡上傳輸的問題,于是面向傳輸的眾多 UTF(UCS Transfer Format)標準出現了,顧名思義,UTF-8就是每次8個位傳輸數據,而UTF-16就是每次16個位。UTF-8就是在互聯網上使用最廣的一種unicode的實現方式,這是為傳輸而設計的編碼 ? 來說說概念吧: 字符集合(Character set):是一組形狀的集合,例如所有漢字的集合,發明于公元前,發明者是倉頡。它體現了字符的“形狀”,它與計算機、編碼等無關。編碼字符集(Coded character set):是一組字符對應的編碼(即數字),為字符集合中的每一個字符給予一個數字。例如最早的編碼字符集ASCII,和后來的unicode(持續更新中)。由于編碼字符集為每一個字符賦予一個數字,因此,字符可以認為就是一個16位的數字,因此以下方式都可以給字符賦值: char c=‘中’ char c =0x4e2d char c=20013 字符編碼方案(Character-encoding schema):將字符編碼(數字)映射到一個字節數組的方案,因為在磁盤里,所有信息都是以字節的方式存儲的。因此16位字符必須轉換為一個字節數組才能夠存儲。例如UTF-8字符編碼方案,它可以將一個字符轉換為1、2、3或者4個字節。
一般認為,編碼字符集和字符編碼方案合起來被稱之為字符集(Charset),這是一個術語,要和前面的字符集合(Character set)區分開。 ?
二、UTF-8
UTF-8最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。UTF-8的編碼規則很簡單,只有二條:1)對于單字節的符號,字節的第一位設為0,后面7位為這個符號的unicode碼。因此對于英語字母,UTF-8編碼和ASCII碼是相同的。2)對于n字節的符號(n>1),第一個字節的前n位都設為1,第n+1位設為0,后面字節的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個符號的unicode碼。下表總結了編碼規則,字母x表示可用編碼的位。Unicode符號范圍 | UTF-8編碼方式(十六進制) | (二進制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
三、Little-Endian、Big-Endian
字節序就是數據在內存中存放的順序,多于一個字節的數據在內存中存放時有兩種選擇,即Big Endian和Little Endian。Little-Endian就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。
Big-Endian就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。
Big Endian和Little Endian和芯片類型以及操作系統都有關系。
四、舉例
下面,以漢字“嚴”為例,演示如何實現UTF-8編碼。 已知“嚴”的unicode是4E25(100111000100101),根據上表,可以發現4E25處在第三行的范圍內(0000 0800-0000 FFFF),因此“嚴”的UTF-8編碼需要三個字節,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,從“嚴”的最后一個二進制位開始,依次從后向前填入格式中的x,多出的位補0。這樣就得到了,“嚴”的UTF-8編碼是“11100100 10111000 10100101”,這是保存在計算機中的實際數據,轉換成十六進制就是E4B8A5,轉成十六進制的目的為了便于閱讀。1. Unicode與UTF-8之間的轉換通過上一節的例子,可以看到“嚴”的Unicode碼是4E25,UTF-8編碼是E4B8A5,兩者是不一樣的。它們之間的轉換可以通過程序實現。在Windows平臺下,有一個最簡單的轉化方法,就是使用內置的記事本小程序Notepad.exe。打開文件后,點擊“文件”菜單中的“另存為”命令,會跳出一個對話框,在最底部有一個“編碼”的下拉條。bg2007102801.jpg里面有四個選項:ANSI,Unicode,Unicode big endian 和 UTF-8。1)ANSI是默認的編碼方式。對于英文文件是ASCII編碼,對于簡體中文文件是GB2312編碼(只針對Windows簡體中文版,如果是繁體中文版會采用Big5碼)。2)Unicode編碼指的是UCS-2編碼方式,即直接用兩個字節存入字符的Unicode碼。這個選項用的little endian格式。3)Unicode big endian編碼與上一個選項相對應。我在下一節會解釋little endian和big endian的涵義。4)UTF-8編碼,也就是上一節談到的編碼方法。選擇完”編碼方式“后,點擊”保存“按鈕,文件的編碼方式就立刻轉換好了。三、 Little endian和Big endian上一節已經提到,Unicode碼可以采用UCS-2格式直接存儲。以漢字”嚴“為例,Unicode碼是4E25,需要用兩個字節存儲,一個字節是4E,另一個字節是25。存儲的時候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。那么很自然的,就會出現一個問題:計算機怎么知道某一個文件到底采用哪一種方式編碼?Unicode規范中定義,每一個文件的最前面分別加入一個表示編碼順序的字符,這個字符的名字叫做”零寬度非換行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。這正好是兩個字節,而且FF比FE大1。如果一個文本文件的頭兩個字節是FE FF,就表示該文件采用大頭方式;如果頭兩個字節是FF FE,就表示該文件采用小頭方式。四、 實例下面,舉一個實例。打開”記事本“程序Notepad.exe,新建一個文本文件,內容就是一個”嚴“字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8編碼方式保存。然后,用文本編輯軟件UltraEdit中的”十六進制功能“,觀察該文件的內部編碼方式。1)ANSI:文件的編碼就是兩個字節“D1 CF”,這正是“嚴”的GB2312編碼,這也暗示GB2312是采用大頭方式存儲的。2)Unicode:編碼是四個字節“FF FE 25 4E”,其中“FF FE”表明是小頭方式存儲,真正的編碼是4E25。3)Unicode big endian:編碼是四個字節“FE FF 4E 25”,其中“FE FF”表明是大頭方式存儲。4)UTF-8:編碼是六個字節“EF BB BF E4 B8 A5”,前三個字節“EF BB BF”表示這是UTF-8編碼,后三個“E4B8A5”就是“嚴”的具體編碼,它的存儲順序與編碼順序是一致的。推薦這篇文章看一下:http://wiki.ubuntu.org.cn/index.php?title=Unicode&variant=zh-cn#.E8.B5.B7.E6.BA.90.E8.88.87.E7.99.BC.E5.B1.95 4.解決的問題:一、如何在中文系統中運行非Unicode編碼程序?
有很多意大利文版(除英文版)學習軟件、百科全書等軟件在中文系統上會出現亂碼,解決方法:
WindowsXP內核是Unicode編碼,支持多語種,對于Unicode編碼的應用程序會正常顯示原文(因為windows核心是用unicode代碼寫的,所以不存在問題),但是,很多程序不是用Unicode編碼寫的,這時WindowsXP系統可以指定以特定的編碼運行非Unicode編碼程序,中文版WindowsXP默認的是“簡體中文GB2312”。你只需在控制面板--〉區域和語言選項--〉高級--〉為非Unicode程序的語言選擇“意大利語”,即可正確運行意大利文版的游戲程序。分析:我理解的流程是這樣:程序------>意大利語編碼(轉換表codepage)------>解釋成unicode識別的編碼(通過指定的轉換表將非 Unicode 的字符編碼轉換為同一字符對應的系統內部使用的 Unicode 編碼)------>被系統翻譯成意大利文(因為每個unicode編碼對應了相應的意大利文字),便可以正常顯示了。二、消除網頁亂碼?網頁亂碼是瀏覽器對HTML網頁解釋時形成的,如果網頁制作時編碼為繁體big5,瀏覽器卻以編碼gb2312顯示該網頁,就會出現亂碼,因此只要你在瀏覽器中也以繁體big5顯示該網頁,就會消除亂碼。打個比方有些像字典,繁體字得用繁體字典來查看,簡體字得用簡體字典來查看,不然你看不懂。 【解決辦法】:在瀏覽器中選擇“編碼”菜單,事先為瀏覽器安裝多語言支持包(例如在安裝IE時要安裝多語言支持包),這樣當瀏覽網頁出現亂碼時,即可手工更改查看此網頁的編碼方式,在瀏覽器中選擇菜單欄下的“查看”/“編碼”/“自動選擇”/簡體中文(GB2312),如為繁體中文則選擇“查看”/“編碼”/“自動選擇”/繁體中文(BIG5),其他語言依此類推,便可消除網頁亂碼現象。 分析:因為繁體big5編碼后的文件,每個文字對應一個二進制流(假設是1212對應繁這個字),當我們以編碼gb2312顯示該網頁時,gb2312編碼會到表里去找1212(二進制流不會變的)對應誰,肯定不再是繁這個字了,當然顯示的就不再是那個繁字了,也就會出現亂碼了。這樣理解簡單些,其實中間還要轉換成同一字符對應的系統內部使用的 Unicode 編碼,然后通過系統底層unicode編碼還原成相應字符顯示出來。 原文地址:到底utf-8和unicode是什么關系 - - ITeye技術網站
?
posted on 2017-05-08 16:05 風雨一肩挑 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/hiwuchong/p/6825527.html
總結
以上是生活随笔為你收集整理的Unicode、UTF-8、Big Endian、Little Endian、GBK、UCS-2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fixedBox固定div漂浮代码 支持
- 下一篇: 十一周进度