前面寫了那么多砍聊,終于來到了重點......
本文中背伴,我們先來演示常見的轉(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。