java中文亂碼解決之道(3):編碼詳情:偉大的創(chuàng)想—Unicode編碼

隨著計算機的發(fā)展荞胡、普及,世界各國為了適應本國的語言和字符都會自己設計一套自己的編碼風格,正是由于這種亂斑芜,導致存在很多種編碼方式,以至于同一個二進制數字可能會被解釋成不同的符號祟霍。為了解決這種不兼容的問題杏头,偉大的創(chuàng)想Unicode編碼應時而生!沸呐!
Unicode
Unicode又稱為統(tǒng)一碼醇王、萬國碼、單一碼崭添,它是為了解決傳統(tǒng)的字符編碼方案的局限而產生的寓娩,它為每種語言中的每個字符設定了統(tǒng)一并且唯一的二進制編碼,以滿足跨語言滥朱、跨平臺進行文本轉換根暑、處理的要求♂懔冢可以想象Unicode作為一個“字符大容器”排嫌,它將世界上所有的符號都包含其中,并且每一個符號都有自己獨一無二的編碼缰犁,這樣就從根本上解決了亂碼的問題淳地。所以Unicode是一種所有符號的編碼[2]

Unicode伴隨著通用字符集的標準而發(fā)展帅容,同時也以書本的形式對外發(fā)表颇象,它是業(yè)界的標準,對世界上大部分的文字系統(tǒng)進行了整理并徘、編碼遣钳,使得電腦可以用更為簡單的方式來呈現和處理文字。Unicode至今仍在不斷增修麦乞,迄今而至已收入超過十萬個字符蕴茴,它備受業(yè)界認可,并廣泛地應用于電腦軟件的國際化與本地化過程姐直。
我們知道Unicode是為了解決傳統(tǒng)的字符編碼方案的局限而產生的倦淀,對于傳統(tǒng)的編碼方式而言,他們都存在一個共同的問題:無法支持多語言環(huán)境声畏,這對于互聯網這個開放的環(huán)境是不允許的撞叽。而目前幾乎所有的電腦系統(tǒng)都支持基本拉丁字母,并各自支持不同的其他編碼方式。Unicode為了和它們相互兼容愿棋,其首256字符保留給ISO 8859-1所定義的字符科展,使既有的西歐語系文字的轉換不需特別考量;并且把大量相同的字符重復編到不同的字符碼中去初斑,使得舊有紛雜的編碼方式得以和Unicode編碼間互相直接轉換辛润,而不會丟失任何信息[1]。

實現方式
一個字符的Unicode編碼是確定的见秤,但是在實際傳輸過程中砂竖,由于不同系統(tǒng)平臺的設計不一定一致,以及出于節(jié)省空間的目的鹃答,對Unicode編碼的實現方式有所不同乎澄。Unicode的實現方式稱為Unicode轉換格式(Unicode Transformation Format,簡稱為UTF)[1]
测摔。
Unicode是字符集置济,它主要有UTF-8、UTF-16锋八、UTF-32三種實現方式浙于。由于UTF-8是目前主流的實現方式,UTF-16挟纱、UTF-32相對而言使用較少羞酗,所以下面就主要介紹UTF-8。
UCS
提到Unicode可能有必要了解下紊服,UCS檀轨。UCS(Universal Character Set,通用字符集)欺嗤,是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標準所定義的標準字符集参萄。它包括了其他所有字符集,保證了與其他字符集的雙向兼容煎饼,即讹挎,如果你將任何文本字符串翻譯到UCS格式,然后再翻譯回原編碼吆玖,你不會丟失任何信息筒溃。
UCS不僅給每個字符分配一個代碼,而且賦予了一個正式的名字衰伯。表示一個UCS或Unicode值的十六進制數通常在前面加上“U+”,例如“U+0041”代表字符“A”积蔚。
Little endian & Big endian
由于各個系統(tǒng)平臺的設計不同意鲸,可能會導致某些平臺對字符的理解不同(比如字節(jié)順序的理解)。這時將會導致同意字節(jié)流可能會被解釋為不同的內容。如某個字符的十六進制為4E59怎顾,拆分為4E读慎、59,在MAC上讀取時是歐諾個低位開始的槐雾,那么MAC在遇到該字節(jié)流時會被解析為594E夭委,找到的字符為“奎”,但是在Windows平臺是從高字節(jié)開始讀取募强,為4E59株灸,找到的字符為“乙”。也就是說在Windows平臺保存的“乙”跑到MAC平臺上就變成了“奎”擎值。這樣勢必會引起混亂慌烧,于是在Unicode編碼中采用了大頭(Big endian)、小頭(Little endian)兩種方式來進行區(qū)分鸠儿。即第一個字節(jié)在前屹蚊,就是大頭方式,第二個字節(jié)在前就是小頭方式进每。那么這個時候就出現了一個問題:計算機怎么知道某個文件到底是采用哪種編碼方式的呢汹粤?
Unicode規(guī)范中定義,每一個文件的最前面分別加入一個表示編碼順序的字符田晚,這個字符的名字叫做”零寬度非換行空格”(ZERO WIDTH NO-BREAK SPACE)嘱兼,用FEFF表示。這正好是兩個字節(jié)肉瓦,而且FF比FE大1遭京。
如果一個文本文件的頭兩個字節(jié)是FE FF,就表示該文件采用大頭方式泞莉;如果頭兩個字節(jié)是FF FE哪雕,就表示該文件采用小頭方式屯阀。
UTF-8
UTF-8是一種針對Unicode的可變長度字符編碼,可以使用1~4個字節(jié)表示一個符號适刀,根據不同的符號而變化字節(jié)長度。它可以用來表示Unicode標準中的任何字符肯腕,且其編碼中的第一個字節(jié)仍與ASCII兼容挨厚,這使得原來處理ASCII字符的系統(tǒng)無須或只須做少部份修改堡僻,即可繼續(xù)使用。因此疫剃,它逐漸成為電子郵件钉疫、網頁及其他存儲或傳送文字的應用中,優(yōu)先采用的編碼巢价。
UTF-8使用一到四個字節(jié)為每個字符編碼牲阁,編碼規(guī)則如下:
1)對于單字節(jié)的符號固阁,字節(jié)的第一位設為0,后面7位為這個符號的unicode碼城菊。因此對于英語字母备燃,UTF-8編碼和ASCII碼是相同的。
2)對于n字節(jié)的符號(n>1)凌唬,第一個字節(jié)的前n位都設為1并齐,第n+1位設為0,后面字節(jié)的前兩位一律設為10客税。剩下的沒有提及的二進制位况褪,全部為這個符號的unicode碼。
轉換表如下:
Unicode

UTF-8

0000 ~007F

0XXX XXXX

0080 ~07FF

110X XXXX 10XX XXXX

0800 ~FFFF

1110XXXX 10XX XXXX 10XX XXXX

1 0000 ~1F FFFF

1111 0XXX 10XX XXXX 10XX XXXX 10XX XXXX

20 0000 ~3FF FFFF

1111 10XX 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX

400 0000 ~7FFF FFFF

1111 110X 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX

根據上面的轉換表霎挟,理解UTF-8的轉換編碼規(guī)則就變得非常簡單了:第一個字節(jié)的第一位如果為0窝剖,則表示這個字節(jié)單獨就是一個字符;如果為1,連續(xù)多少個1就表示該字符占有多少個字節(jié)酥夭。
以漢字”嚴”為例赐纱,演示如何實現UTF-8編碼[3]

已知”嚴”的unicode是4E25(100111000100101)熬北,根據上表疙描,可以發(fā)現4E25處在第三行的范圍內(0000 0800-0000 FFFF),因此”嚴”的UTF-8編碼需要三個字節(jié)讶隐,即格式是”1110xxxx 10xxxxxx 10xxxxxx”起胰。然后,從”嚴”的最后一個二進制位開始巫延,依次從后向前填入格式中的x效五,多出的位補0。這樣就得到了炉峰,”嚴”的UTF-8編碼是”11100100 10111000 10100101″畏妖,轉換成十六進制就是E4B8A5。
Unicode與UTF-8之間的轉換
通過上面的例子我們可以看到”嚴”的Unicode碼為4E25疼阔,UTF-8編碼為E4B8A5戒劫,他們兩者是不一樣的,需要通過程序的轉換來實現婆廊,在Window平臺最簡單的直觀的方法就是記事本迅细。


在最下面的”編碼(E)”處有四個選項:ANSI、Unicode淘邻、Unicode big endian茵典、UTF-8。
ANSI:記事本的默認的編碼方式宾舅,對于英文文件是ASCII編碼统阿,對于簡體中文文件是GB2312編碼枚尼。注意:不同 ANSI 編碼之間互不兼容,當信息在國際間交流時砂吞,無法將屬于兩種語言的文字,存儲在同一段 ANSI 編碼的文本中
Unicode:UCS-2編碼方式崎溃,即直接用兩個字節(jié)存入字符的Unicode碼蜻直。該方式是”小頭”little endian方式。
Unicode big endian:UCS-2編碼方式袁串,”大頭”方式概而。
UTF-8:閱讀上面(UTF-8)。

實例:在記事本中輸入”嚴”字囱修,依次選擇ANSI赎瑰、Unicode、Unicode big endian破镰、UTF-8四種編碼風格餐曼,然后另存為,使用EditPlus文本工具使用”16進制查看器”進行查看鲜漩,得到如下結果:

1

2

3

4

ANSI:兩個字節(jié)”D1 CF”正是”嚴”的GB2312編碼源譬。
Unicode:四個字節(jié)”FF FE 25 4E”,其中”FF FE”表示小頭存儲方式孕似,真正的編碼為”25 4E”踩娘。
Unicode big endian:四個字節(jié)”FE FF 4E 25″,”FE FF”表示大頭存儲方式喉祭,真正編碼為”4E 25″养渴。
UTF-8:編碼是六個字節(jié)”EF BB BF E4 B8 A5″,前三個字節(jié)”EF BB BF”表示這是UTF-8編碼泛烙,后三個”E4B8A5″就是”嚴”的具體編碼理卑,它的存儲順序與編碼順序是一致的。
參考文獻&更多閱讀
1胶惰、Unicode維基百科:http://zh.wikipedia.org/wiki/Unicode
2傻工、Unicode百度百科:http://baike.baidu.com/view/40801.htm
3、字符編碼筆記:ASCII孵滞,Unicode和UTF-8:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
4中捆、UTF-8百度百科:http://baike.baidu.com/view/25412.htm

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坊饶,隨后出現的幾起案子泄伪,更是在濱河造成了極大的恐慌,老刑警劉巖匿级,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟋滴,死亡現場離奇詭異染厅,居然都是意外死亡,警方通過查閱死者的電腦和手機津函,發(fā)現死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門肖粮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尔苦,你說我怎么就攤上這事涩馆。” “怎么了允坚?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵魂那,是天一觀的道長。 經常有香客問我稠项,道長涯雅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任展运,我火速辦了婚禮活逆,結果婚禮上,老公的妹妹穿的比我還像新娘拗胜。我一直安慰自己划乖,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布挤土。 她就那樣靜靜地躺著琴庵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仰美。 梳的紋絲不亂的頭發(fā)上迷殿,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音咖杂,去河邊找鬼庆寺。 笑死,一個胖子當著我的面吹牛诉字,可吹牛的內容都是我干的懦尝。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼壤圃,長吁一口氣:“原來是場噩夢啊……” “哼陵霉!你這毒婦竟也來了?” 一聲冷哼從身側響起伍绳,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤踊挠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冲杀,有當地人在樹林里發(fā)現了一具尸體效床,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡睹酌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了剩檀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憋沿。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沪猴,靈堂內的尸體忽然破棺而出卤妒,到底是詐尸還是另有隱情,我是刑警寧澤字币,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站共缕,受9級特大地震影響洗出,放射性物質發(fā)生泄漏。R本人自食惡果不足惜图谷,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一翩活、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧便贵,春花似錦菠镇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盔粹,卻和暖如春隘梨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舷嗡。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工轴猎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人进萄。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓捻脖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親中鼠。 傳聞我的和親對象是個殘疾皇子可婶,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容