<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 262,  comments - 221,  trackbacks - 0

    Unicode中文“藝”字: 827A

    二進(jìn)制的“藝”字編碼:1000 0010 0111 1010

    UTF-8的中文編碼規(guī)則: 1110xxxx 10xxxxxx 10xxxxxx

    UTF-8的“藝”字編碼: 1110【1000】 10【0010】【01】 10【11】【1010】

    UTF-8的轉(zhuǎn)碼過(guò)程解析: 8對(duì)應(yīng)的1000被填入第一字節(jié)剩余的4位。2對(duì)應(yīng)的0010被填入第2字節(jié)剩余的前4位。7對(duì)應(yīng)的0111被拆開,前2位01被填入第2字節(jié)的后兩位,后2位1被填入第3字節(jié)的前2位。A對(duì)應(yīng)的1010被填入第3字節(jié)的后4位。

    UTF-8的最終編碼結(jié)果:11101000---對(duì)應(yīng)E8;10001001---對(duì)應(yīng)89;10111010---對(duì)應(yīng)BA。所以最終的UTF-8編碼就是%E8%89%BA

    Unicode到UTF-8的轉(zhuǎn)換:Unicode的16進(jìn)制編碼<-->對(duì)應(yīng)的2進(jìn)制編碼<-->UTF-8規(guī)范的2進(jìn)制編碼<-->UTF-8規(guī)范的16進(jìn)制編碼

    也就是說(shuō)假如在Java的底層JVM,由于采用的是Unicode編碼字符集,對(duì)“藝”字的編碼是827A。那么在網(wǎng)絡(luò)傳輸?shù)倪^(guò)程中,我們當(dāng)然不能直接傳輸827A這個(gè)字符過(guò)去代表藝”這個(gè)漢字,而必須要轉(zhuǎn)換成0,1這樣的字節(jié)流,才能在網(wǎng)絡(luò)中傳輸。

    所以說(shuō)UTF-8是一種為了方便網(wǎng)路傳輸,節(jié)省傳輸數(shù)量,而對(duì)Unicode的字符集的字符編號(hào)進(jìn)行轉(zhuǎn)換,從定長(zhǎng)的2個(gè)字節(jié)(16進(jìn)制)轉(zhuǎn)換成1~3個(gè)的變長(zhǎng)字節(jié)(2進(jìn)制)表示的轉(zhuǎn)換格式。

    由于Unicode采用的是2個(gè)字節(jié)的編碼方式,而UTF-8轉(zhuǎn)換后可能是1~3個(gè)字節(jié),所以同一個(gè)漢字,在Unicode中的編碼和經(jīng)UTF-8轉(zhuǎn)換后的編碼值肯定是不同的。就好像藝字的Unicode編碼是827A,經(jīng)轉(zhuǎn)換后的3個(gè)字節(jié)是E889BA。

    所以說(shuō)對(duì)于英文字符來(lái)說(shuō),采用UTF-8對(duì)Unicode編碼轉(zhuǎn)換后節(jié)省了一倍的傳輸成本(由定長(zhǎng)的2個(gè)字節(jié)變長(zhǎng)1個(gè)字節(jié)),但對(duì)于原本雙字節(jié)的東亞字符來(lái)說(shuō),反而增加了成本,是原來(lái)的1.5倍。

    小結(jié):

    ①ASCII、GB2312、GBK、GB18030、Big5、Unicode都是字符集的名稱。它們定義了采用1~2個(gè)字節(jié)的編碼規(guī)范,為每個(gè)字符賦予了一個(gè)獨(dú)一無(wú)二的編號(hào)。這個(gè)編號(hào)就是我們所說(shuō)的“字符編碼”。

    ②Unicode字符集定義的字符編碼并不適合直接通過(guò)網(wǎng)絡(luò)傳輸表達(dá),因?yàn)樗鼈儽仨氜D(zhuǎn)換成像0101這樣的二進(jìn)制字節(jié)流傳輸。所以就出現(xiàn)了不同的轉(zhuǎn)換規(guī)范實(shí)現(xiàn)方式:UTF-8,TF-16等。這些不同的轉(zhuǎn)換規(guī)范轉(zhuǎn)換后的編碼值和Unicode是不同的。

    對(duì)于UTF-8來(lái)說(shuō),它采用變長(zhǎng)字節(jié)表示所有Unicode字符,對(duì)于英文來(lái)說(shuō)和ASCII兼容,對(duì)于東亞字符來(lái)說(shuō),是原來(lái)傳輸成本的1.5倍。所以采用UTF-8編碼轉(zhuǎn)換方式雖然有利于統(tǒng)一,但增加了中文等雙字節(jié)字符的傳輸成本。

    UTF-8采用首字節(jié)的高位"1"的個(gè)數(shù)表示字符的編碼長(zhǎng)度。例如在Unicode的編碼規(guī)范中:漢字的表示區(qū)間為U-00000800至U-0000FFFF對(duì)應(yīng)的UTF-8的轉(zhuǎn)換規(guī)則為:1110xxxx 10xxxxxx 10xxxxxx 首字節(jié)3個(gè)1代表這個(gè)字符的編碼長(zhǎng)度為3個(gè)字節(jié)。如果是2個(gè)1則表示2個(gè)字節(jié)

    ③在底層的平臺(tái)中如JVM,采用的是Unicode字符集,當(dāng)要把這些字符通過(guò)網(wǎng)絡(luò)傳輸時(shí),可以選擇通過(guò)UTF-8或其他(例如GB2312)編碼轉(zhuǎn)換方式對(duì)要傳輸?shù)淖址幋a進(jìn)行轉(zhuǎn)換。如果目的端也是采用Unicode字符集,那么UTF-8轉(zhuǎn)換后的編碼可以被正常識(shí)別并解碼成最終對(duì)應(yīng)的Unicode字符集編號(hào)。如果是非Unicode字符集平臺(tái)則可能出現(xiàn)亂碼(UTF-8中漢字的3個(gè)連續(xù)字節(jié)被解析成GB2312的2個(gè)連續(xù)字節(jié),出現(xiàn)丟失)。所以推薦在傳輸?shù)膬啥瞬捎肬nicode字符集編碼,在傳輸方式上采用UTF-8轉(zhuǎn)換方式。

    javac命令是以系統(tǒng)默認(rèn)編碼讀入源文件,然后按Unicode進(jìn)行編碼的。(備注:每個(gè)文件都有自己的編碼,javac命令按照默認(rèn)的文件編碼讀入,但是在將.java文件轉(zhuǎn)換成.class的過(guò)程中,javac會(huì)將所有的字符轉(zhuǎn)化成unicode的格式保存。)

    在運(yùn)行時(shí)JVM也是采用unicode編碼的,并且默認(rèn)輸入和輸出使用的都是操作系統(tǒng)的默認(rèn)編碼。也就是說(shuō)在new String(bytes[,encode])中,系統(tǒng)認(rèn)為輸入的bytes是編碼為encode的字節(jié)流(如果不指定encode,那么就是默認(rèn)使用系統(tǒng)的編碼方式),換句話說(shuō),如果按encode來(lái)翻譯bytes才能得到正確的原始字符,這個(gè)字符最后要在java中保存,它還是要從這個(gè)encode轉(zhuǎn)換成Unicode的。

    也就是說(shuō),假如我們需要從磁盤文件、數(shù)據(jù)庫(kù)記錄、網(wǎng)絡(luò)傳輸一些字符,保存到Java的變量中,要經(jīng)歷由bytes-->encode字符-->Unicode字符的轉(zhuǎn)換(例如new String(bytes, encode));而要把Java變量保存到文件、數(shù)據(jù)庫(kù)或者通過(guò)網(wǎng)絡(luò)傳輸,系統(tǒng)要做一個(gè)Unicode字符-->encode字符-->bytes的轉(zhuǎn)換(例如String.getBytes([encode]))



    -------------------------------------------------------------
    生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
    posted on 2010-02-16 23:23 Paul Lin 閱讀(3682) 評(píng)論(3)  編輯  收藏 所屬分類: J2SE


    FeedBack:
    # re: 【Java基礎(chǔ)專題】編碼與亂碼(01)---編碼基礎(chǔ)
    2012-12-12 16:16 | 砂銀
    非常有用,謝謝  回復(fù)  更多評(píng)論
      
    # re: 【Java基礎(chǔ)專題】編碼與亂碼(01)---編碼基礎(chǔ)[未登錄]
    2014-04-22 11:08 | 小龍
    謝謝,幫了我大忙!  回復(fù)  更多評(píng)論
      
    # re: 【Java基礎(chǔ)專題】編碼與亂碼(01)---編碼基礎(chǔ)[未登錄]
    2016-04-04 14:16 |
    666666666666666666666這幾天正在做個(gè)類似工程編碼出現(xiàn)錯(cuò)誤  回復(fù)  更多評(píng)論
      
    <2010年2月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28123456
    78910111213

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點(diǎn)博客

    好友博客

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 日韩在线免费视频| 亚洲中文无韩国r级电影 | www成人免费观看网站| 亚洲an日韩专区在线| 亚洲av永久无码精品网址| 久久久久亚洲精品成人网小说| 精品国产精品久久一区免费式| 69av免费观看| 欧洲人免费视频网站在线| 成人嫩草影院免费观看| 亚洲精品无码mv在线观看网站| 国产免费69成人精品视频| 日韩一区二区a片免费观看| 91在线手机精品免费观看| 久青草视频97国内免费影视| 国产亚洲精彩视频| 欧美激情综合亚洲一二区| 亚洲va久久久久| 亚洲AV无码国产精品色| 亚洲精品乱码久久久久久下载| 国产亚洲婷婷香蕉久久精品| 久久久久亚洲AV成人网| 亚洲国产小视频精品久久久三级| 日本高清免费不卡视频| 免费看www视频| 精品无码国产污污污免费| 日韩一品在线播放视频一品免费| 一二三四免费观看在线视频中文版 | 亚洲欧洲国产精品久久| 麻豆亚洲AV永久无码精品久久| 久久国产亚洲观看| 亚洲国产高清人在线| 久久亚洲精品AB无码播放| 亚洲电影免费在线观看| 久久亚洲美女精品国产精品| 久久精品国产亚洲AV麻豆网站| 久久av无码专区亚洲av桃花岛| 亚洲精品免费在线| 亚洲国产区男人本色在线观看| 亚洲日韩亚洲另类激情文学| 亚洲Av无码国产一区二区|