Java字符編碼原理_第1頁(yè)
Java字符編碼原理_第2頁(yè)
Java字符編碼原理_第3頁(yè)
Java字符編碼原理_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Java 字符編碼原理Java 開發(fā)中,常常會(huì)遇到亂碼的問題,一旦遇到這種問題,常常比較煩惱,大家都不愿意承認(rèn)是自己的代碼有問題。其 實(shí)編碼問題并沒有那么神秘,那么不可捉摸,搞清 Java 的編碼本質(zhì)過程就真相大白了。先看個(gè)圖:其實(shí),編碼問題存在兩個(gè)方面:JVM 之內(nèi)和 JVM 之外。1、 Java 文件編譯后形成 class這里 Java 文件的編碼可能有多種多樣, 但 Java 編譯器會(huì)自動(dòng)將這些編碼按照 Java 文件的編碼格式正確讀取后產(chǎn)生 class 文件,這里的 class 文件編碼是 Unicode 編碼(具體說是 UTF-16編碼。因此,在 Java 代碼中定義一個(gè)字符串:St

2、ring s="漢字 "不管在編譯前 java 文件使用何種編碼,在編譯后成 class 后,他們都是一樣的 -Unicode 編碼表示。1 / 3 2、 JVM 中的編碼JVM 加載 class 文件讀取時(shí)候使用 Unicode 編碼方式正確讀取 class 文件, 那么原來定義的 String s="漢字 " 在內(nèi)存中 的表現(xiàn)形式是 Unicode 編碼。當(dāng)調(diào)用 String.getBytes(的時(shí)候, 其實(shí)已經(jīng)為亂碼買下了禍根。 因?yàn)榇朔椒ㄊ褂闷脚_(tái)默認(rèn)的字符集來獲取字符串對(duì)應(yīng)的 字節(jié)數(shù)組。在 WindowsXP 中文版中,使用的默認(rèn)編碼是 GBK

3、,不信運(yùn)行下:public class Test public static void main(String args System.out.println(" 當(dāng)前 JRE :" + System.getProperty("java.version" ;System.out.println(" 當(dāng)前 JVM 的默認(rèn)字符集:" + Charset.defaultCharset(;當(dāng)前 JRE :1.8.0_16當(dāng)前 JVM 的默認(rèn)字符集:GBK當(dāng)不同的系統(tǒng)、數(shù)據(jù)庫(kù)經(jīng)過多次編碼后,如果對(duì)其中的原理不理解,就容易導(dǎo)致亂碼。因此,在一個(gè)系

4、統(tǒng)中,有必要對(duì) 字符串的編碼做一個(gè)統(tǒng)一,這個(gè)統(tǒng)一模糊點(diǎn)說,就是對(duì)外統(tǒng)一。比如方法字符串參數(shù), IO 流,在中文系統(tǒng)中,可以統(tǒng)一使用 GBK 、 GB13080、 UTF-8、 UTF-16等等都可以,只是要選擇有些更大字符集,以保證任何可能用到的字符都可以正常顯示, 避免亂碼的問題。(假設(shè)對(duì)所有的文件都用 ASCII 碼那么就無法實(shí)現(xiàn)雙向轉(zhuǎn)換了。要特別注意的是, UTF-8并非能容納了所有的中文字符集編碼,因此,在特殊情況下, UTF-8轉(zhuǎn) GB18030可能會(huì)出現(xiàn) 亂碼, 然而一群傻 B 常常在做中文系統(tǒng)喜歡用 UTF-8編碼而不說不出個(gè)所以然出來! 最傻 B 的是, 一個(gè)系統(tǒng)多個(gè)人做, 源

5、代 碼文件有的人用 GBK 編碼,有人用 UTF-8,還有人用 GB18030。 FK ,都是中國(guó)人,也不是外包項(xiàng)目,用什么 UTF-8啊, 神經(jīng)!源代碼統(tǒng)統(tǒng)都用 GBK18030就 OK 了,免得 ANT 腳本編譯時(shí)候提示不可認(rèn)的字符編碼。因此,對(duì)于中文系統(tǒng)來說,最好選擇 GBK 或 GB18030編碼(其實(shí) GBK 是 GB18030的子集,以便最大限度的避免 亂碼現(xiàn)象。3、內(nèi)存中字符串的編碼內(nèi)存中的字符串不僅僅局限于從 class 代碼中直接加載而來的字符串,還有一些字符串是從文本文件中讀取的,還有的 是通過數(shù)據(jù)庫(kù)讀取的,還有可能是從字節(jié)數(shù)組構(gòu)建的,然而他們基本上都不是 Unicode 編碼的,原因很簡(jiǎn)單,存儲(chǔ)優(yōu)化。2 / 3因此就需要處理各種各樣的編碼問題, 在處理之前, 必須明確 “源” 的編碼, 然后用指定的編碼方式正確讀取到內(nèi)存中。 如果是一個(gè)方法的參數(shù),實(shí)際上必須明確該字符串參數(shù)的編碼,因?yàn)檫@個(gè)參數(shù)可能是另外一個(gè)日文系統(tǒng)傳遞過來的。當(dāng)明確 了字符串編碼時(shí)候,就可以按照要求正確處理字符串,以避免亂碼。在對(duì)字符串進(jìn)行解碼編碼的時(shí)候,應(yīng)該調(diào)用下面的方法:getBytes(String charsetNameString(byte b

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論