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

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

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


    我們經(jīng)常會遇到編碼問題。Java號稱國際化的語言,是因?yàn)樗?/span>class文件采用UTF-8,而JVM運(yùn)行時使用UTF-16(至于為什么JVM中要采用UTF-16,我沒看過 相關(guān)的資料,但我猜可能是因?yàn)?/span>JAVA里面一個字符(char)就是16位的,而UTF-16正是雙字節(jié)編碼),都是unicode的編碼。

    unicode
    的目標(biāo)就是能支持世界上所有的字符集,也就是說幾乎所有的字符集包含的字符在unicode中都有對應(yīng)的編碼。在unicode中,字符與代碼的映射關(guān) 系,就是unicode字符集,稱為UCS(Unicode Character Set),每個unicode字符編碼稱為code point(代碼點(diǎn)?)。UTF-8UTF-16是不同的UCS編碼方法,UTF就是UCS Transformation Format。;

    Java 中,StringgetBytes()方法就是對特定的字符串(unicode)按照給定的字符集進(jìn)行編碼(encode),new String()則可以按照某個字符集將字節(jié)流轉(zhuǎn)換回unicodedecode)。Java里面的每一個String都是unicode編碼。

    再來看頁面,如果不做特殊處理,Form的提交就按照頁面的ContentType設(shè)置中的字符集進(jìn)行編碼轉(zhuǎn)換,發(fā)送到后臺,后臺必須利用req.setCharacterEncoding來指定參數(shù)的編碼格式(不同的應(yīng)用服務(wù)器應(yīng)有不同的指定方式),才能正確解碼。

    Java
    里面的encodedecode都是相對于unicode而言的,encode的意思是將char[] --> XXX Encoding byte[]decode就是由XXX Encoding byte[] --> char[]。平常,當(dāng)我們說GBK編碼轉(zhuǎn)換為UTF-8編碼的時候,實(shí)際的意思就是:GBK Encoding byte[] --> UTF-8 Encoding byte[],這種轉(zhuǎn)換只有在需要用byte[]傳輸數(shù)據(jù)的時候才有意義,否則便是毫無意義的。

    首先要說明的一點(diǎn)是:Java中的String對象就是一個unicode編碼的字符串。

    但是,我們通常會聽到有人說:我們需要將StringISO-8859-1轉(zhuǎn)換為GBK編碼,這又是怎么回事呢?實(shí)際上,我們并不是 一個由ISO-8859-1編碼的String轉(zhuǎn)換為GBK編碼的String”,反復(fù)說明的是,JAVA中的String都是unicode編碼的,所以不存在“ISO- 8859-1編碼的String”“GBK編碼的String”這樣的說法。而需要轉(zhuǎn)換的唯一的原因是String進(jìn)行了錯誤的編碼。我們經(jīng)常會碰到由ISO-8859- 1轉(zhuǎn)換為諸如GBK/UTF-8等等這樣的需求。所謂的轉(zhuǎn)換過程是:String --> byte[] -->String
    也許 你非常清楚這個過程的代碼:new String(text.getBytes("ISO-8859-1"),"GBK")。但是,要真正理解起來并不是那么簡單。表面上看似乎很容易理解, 不就是將text String對象按照ISO-8859-1的方式編碼為byte[]然后再把它按照GBK的方式轉(zhuǎn)換為String嗎?但是這句代碼很容易會被誤解為:text StringISO-8859-1轉(zhuǎn)換為GBK編碼,這種說法是錯誤的。難道你見過用這樣的代碼:new String(text.getBytes("GBK"),"UTF-8")來對String進(jìn)行編碼轉(zhuǎn)換的嗎?

    之所以你會經(jīng)??吹?/span>new String(text.getBytes("ISO-8859-1"),"GBK")這句代碼,是因?yàn)橐粋€GBK的字節(jié)流被錯誤地以ISO-8859- 1的方式轉(zhuǎn)換為Stringunicode)了!發(fā)生這種情況最普遍的地方是一個GBK編碼的網(wǎng)頁向后臺提交數(shù)據(jù)的時候,就有可能會看到這句代碼的出 現(xiàn)。GBK的流被錯誤的當(dāng)成ISO8859-1的流,所以便得到了一個錯誤的String。由于ISO8859-1是單字節(jié)編碼,所以每個字節(jié)被按照原樣 轉(zhuǎn)換為String,也就是說,雖然這是一個錯誤的轉(zhuǎn)換,但編碼沒有改變,所以我們?nèi)匀挥袡C(jī)會把編碼轉(zhuǎn)換回來!所以那句經(jīng)典的new String(text.getBytes("ISO-8859-1"),"GBK")便出現(xiàn)了。

    如果系統(tǒng)誤以為是其它編碼格式,就有可能再也轉(zhuǎn)換不回來了,因?yàn)榫幋a轉(zhuǎn)換并不是負(fù)負(fù)得正那么簡單的 



    歡迎來訪!^.^!
    本BLOG僅用于個人學(xué)習(xí)交流!
    目的在于記錄個人成長.
    所有文字均屬于個人理解.
    如有錯誤,望多多指教!不勝感激!

    Copyright © 久城

    主站蜘蛛池模板: 污网站免费在线观看| 一级毛片**免费看试看20分钟| 亚洲色在线无码国产精品不卡| 美女尿口扒开图片免费| 韩国免费A级毛片久久| 亚洲精品无码你懂的网站| 最新亚洲人成网站在线观看| 中文字幕乱理片免费完整的| 狠狠亚洲婷婷综合色香五月排名 | 边摸边吃奶边做爽免费视频99| 成在线人免费无码高潮喷水| 亚洲国产精品尤物yw在线| 人妻仑乱A级毛片免费看| 国产av无码专区亚洲国产精品| 国产成人精品日本亚洲专| 久久www免费人成看国产片| 亚洲国产精品无码av| 无码免费又爽又高潮喷水的视频| 亚洲人成免费网站| 亚洲AV综合色区无码二区偷拍| 国产三级在线免费观看| 亚洲AV无码一区二区乱子伦| 最近中文字幕高清免费中文字幕mv | 亚洲香蕉在线观看| 免费人成黄页在线观看日本| 色播亚洲视频在线观看| 性短视频在线观看免费不卡流畅| 亚洲国产精品无码久久久不卡 | 免费jlzzjlzz在线播放视频| 久久久久久国产a免费观看不卡| 国产在线观看免费视频播放器 | 亚洲精品永久在线观看| 亚洲av无码成人精品区| 午夜视频免费在线观看| 亚洲日韩精品无码专区网址| 久久精品国产这里是免费| 亚洲最大av资源站无码av网址| 又粗又大又黑又长的免费视频| 亚洲色图国产精品| 韩国18福利视频免费观看| 国产永久免费高清在线|