Java程序員遇上字符亂碼13-字符轉(zhuǎn)碼真正原理

前面寫了那么多砍聊,終于來到了重點......

本文中背伴,我們先來演示常見的轉(zhuǎn)碼寫法叭莫。

string.getBytes("charset"):將string中的字符數(shù)組按照我們指定charset格式轉(zhuǎn)成字節(jié)數(shù)組摩桶。

new String(byte[] byteArray, "charset"):告訴java說,字節(jié)數(shù)組byteArray是按照charset格式解碼得來的茂缚,現(xiàn)在需要對它進行解析并轉(zhuǎn)化成內(nèi)碼為Utf-16格式的字符戏罢。因此,使用這個方法脚囊,要先確定好字節(jié)數(shù)組byteArray是按照什么編碼格式得來的龟糕。

值得注意的是,很多人會錯誤地認(rèn)為ni_new_gbk就是GBK格式的悔耘,還有ni_new_utf8 就是UTF-8格式的讲岁。一定要記得,jvm中字符內(nèi)碼只有UTF-16格式。(不理解可以看我之前的文章)

JVM中字符轉(zhuǎn)碼底層過程原理

1)str.getBytes();

Utf-16-->Unicode--> Utf-8

str中char是Utf-16格式的缓艳,先轉(zhuǎn)化成Unicode,然后再轉(zhuǎn)化成Utf-8

2)str.getBytes("charset");

Utf-16-->Unicode--> charset

str中char是Utf-16格式的校摩,先轉(zhuǎn)化成Unicode,然后再轉(zhuǎn)化成charset

3)String str_new = new String(byteArray, "charset");

charset -->Unicode-->Utf-16

byteArray是某字符(或字符數(shù)組)按照charset格式解碼得來的,先轉(zhuǎn)化成Unicode,然后再轉(zhuǎn)化成Utf-16

由上面阶淘,我們可以發(fā)現(xiàn)Unicode在JVM中是各編碼格式之間轉(zhuǎn)化的中介Q砗摹!舶治!

我們知道分井,Unicode和Utf-8、Utf-16互轉(zhuǎn)是有一套算法的霉猛。然而尺锚,Unicode 和GBK等又如何互轉(zhuǎn)?

Unicode惜浅,作為萬國碼瘫辩,必定是所有編碼方案的中心。別的編碼方案必定跟Unicode有一套轉(zhuǎn)化邏輯坛悉。也因此伐厌,不同編碼方案之間互轉(zhuǎn),也常常以Unicode作為中轉(zhuǎn)裸影。

在這里挣轨,我們要引出CodePage的概念。前面的文章中轩猩,我們演示過在dos窗口改變系統(tǒng)編碼(其實改變的是dos窗口的codepage)卷扮。

CodePage是各國的文字編碼和Unicode之間的映射表。比如簡體中文和Unicode的映射表就是CP936均践。以下是幾個常用的codepage晤锹,相應(yīng)的修改上面的地址的數(shù)字即可。

codepage=936 ? 簡體中文GBK

codepage=950 ? 繁體中文BIG5

codepage=437 ? 美國/加拿大英語

codepage=932 ? 日文

codepage=949 ? 韓文

codepage=866 ? 俄文

上面的codepage彤委,我們可以通過這里獲取鞭铆。

我們打開cp936,即GBK 和 Unicode 映射表。

我們知道 '你'的GBK編碼是:0xC4E3焦影,Unicode編碼是0x4F60车遂,

沒錯,jvm啟動之時會在內(nèi)存中建立此映射表偷办。當(dāng)我們需要對某一個GBK字符轉(zhuǎn)化成UTF-8艰额,JVM底層會先查詢cp936映射表澄港,就可以轉(zhuǎn)化到Unicode編碼椒涯,然后再由Unicode轉(zhuǎn)化到Utf-8。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末回梧,一起剝皮案震驚了整個濱河市废岂,隨后出現(xiàn)的幾起案子祖搓,更是在濱河造成了極大的恐慌,老刑警劉巖湖苞,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拯欧,死亡現(xiàn)場離奇詭異,居然都是意外死亡财骨,警方通過查閱死者的電腦和手機镐作,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隆箩,“玉大人该贾,你說我怎么就攤上這事“齐” “怎么了杨蛋?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長理澎。 經(jīng)常有香客問我逞力,道長,這世上最難降的妖魔是什么糠爬? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任寇荧,我火速辦了婚禮,結(jié)果婚禮上执隧,老公的妹妹穿的比我還像新娘砚亭。我一直安慰自己,他們只是感情好殴玛,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布捅膘。 她就那樣靜靜地躺著,像睡著了一般滚粟。 火紅的嫁衣襯著肌膚如雪寻仗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天凡壤,我揣著相機與錄音署尤,去河邊找鬼。 笑死亚侠,一個胖子當(dāng)著我的面吹牛曹体,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硝烂,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼箕别,長吁一口氣:“原來是場噩夢啊……” “哼列另!你這毒婦竟也來了沪铭?” 一聲冷哼從身側(cè)響起跋核,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤薯酝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后母截,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體到忽,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年清寇,在試婚紗的時候發(fā)現(xiàn)自己被綠了喘漏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡华烟,死狀恐怖陷遮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垦江,我是刑警寧澤帽馋,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站比吭,受9級特大地震影響绽族,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衩藤,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一吧慢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赏表,春花似錦检诗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至间狂,卻和暖如春攻泼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鉴象。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工忙菠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纺弊。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓牛欢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親淆游。 傳聞我的和親對象是個殘疾皇子傍睹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容