本篇內(nèi)容介紹了“Java怎么進(jìn)行字符串編碼轉(zhuǎn)換”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
公司主營業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出魯山免費(fèi)做網(wǎng)站回饋大家。
字符串在java中統(tǒng)一用unicode表示( 即utf-16 LE) , 對于 String s = "你好哦!";如果源碼文件是GBK編碼, 操作系統(tǒng)(windows)默認(rèn)的環(huán)境編碼為GBK,那么編譯時(shí), JVM將按照GBK編碼將字節(jié)數(shù)組解析成字符,然后將字符轉(zhuǎn)換為unicode格式的字節(jié)數(shù)組,作為內(nèi)部存儲。當(dāng)打印這個(gè)字符串時(shí),JVM 根據(jù)操作系統(tǒng)本地的語言環(huán)境,將unicode轉(zhuǎn)換為GBK,然后操作系統(tǒng)將GBK格式的內(nèi)容顯示出來。
當(dāng)源碼文件是UTF-8, 我們需要通知編譯器源碼的格式,javac -encoding utf-8 ... , 編譯時(shí),JVM按照utf-8 解析成字符,然后轉(zhuǎn)換為unicode格式的字節(jié)數(shù)組, 那么不論源碼文件是什么格式,同樣的字符串,最后得到的unicode字節(jié)數(shù)組是完全一致的,顯示的時(shí)候,也是轉(zhuǎn)成GBK來顯示(跟OS環(huán)境有關(guān))
亂碼如何產(chǎn)生?本質(zhì)上都是由于字符串原本的編碼格式與讀取時(shí)解析用的編碼格式不一致導(dǎo)致的。
例如:String s = "你好哦!";
System.out.println( new String(s.getBytes(),"UTF-8")); //錯(cuò)誤,因?yàn)間etBytes()默認(rèn)使用GBK編碼, 而解析時(shí)使用UTF-8編碼,肯定出錯(cuò)。
其中 getBytes() 是將unicode 轉(zhuǎn)換為操作系統(tǒng)默認(rèn)的格式的字節(jié)數(shù)組,即"你好哦"的 GBK格式,new String (bytes, Charset) 中的charset 是指定讀取 bytes 的方式,這里指定為UTF-8,即把bytes的內(nèi)容當(dāng)做UTF-8 格式對待。
如下兩種方式都會有正確的結(jié)果,因?yàn)樗麄兊脑磧?nèi)容編碼和解析用的編碼是一致的。
System.out.println( new String(s.getBytes(),"GBK"));
System.out.println( new String(s.getBytes("UTF-8"),"UTF-8"));
那么,如何利用getBytes 和 new String() 來進(jìn)行編碼轉(zhuǎn)換呢? 網(wǎng)上流傳著一種錯(cuò)誤的方法:GBK--> UTF-8: new String( s.getBytes("GBK") , "UTF-8); ,這種方式是完全錯(cuò)誤的,因?yàn)間etBytes 的編碼與 UTF-8 不一致,肯定是亂碼。但是為什么在tomcat 下,使用new String(s.getBytes("iso-8859-1") ,"GBK") 卻可以用呢?
答案是:tomcat 默認(rèn)使用iso-8859-1編碼, 也就是說,如果原本字符串是GBK的,tomcat傳輸過程中,將GBK轉(zhuǎn)成iso-8859-1了,默認(rèn)情況下,使用iso-8859-1讀取中文肯定是有問題的,那么我們需要將iso-8859-1 再轉(zhuǎn)成GBK, 而iso-8859-1 是單字節(jié)編碼的,即他認(rèn)為一個(gè)字節(jié)是一個(gè)字符, 那么這種轉(zhuǎn)換不會對原來的字節(jié)數(shù)組做任何改變,因?yàn)樽止?jié)數(shù)組本來就是由單個(gè)字節(jié)組成的,如果之前用GBK編碼,那么轉(zhuǎn)成iso-8859-1后編碼內(nèi)容完全沒變, 則 s.getBytes("iso-8859-1") 實(shí)際上還是原來GBK的編碼內(nèi)容;則 new String(s.getBytes("iso-8859-1") ,"GBK") 就可以正確解碼了。 所以說這是一種巧合。
如何正確的將GBK轉(zhuǎn)UTF-8 ? (實(shí)際上是unicode轉(zhuǎn)UTF-8)
String gbkStr = "你好哦!"; //源碼文件是GBK格式,或者這個(gè)字符串是從GBK文件中讀取出來的, 轉(zhuǎn)換為string 變成unicode格式
//利用getBytes將unicode字符串轉(zhuǎn)成UTF-8格式的字節(jié)數(shù)組
byte[] utf8Bytes = gbkStr.getBytes("UTF-8");
//然后用utf-8 對這個(gè)字節(jié)數(shù)組解碼成新的字符串
String utf8Str = new String(utf8Bytes, "UTF-8");
簡化后就是:
public String unicodeToUtf8 (String s) {
return new String( s.getBytes("utf-8") , "utf-8");
}
UTF-8 轉(zhuǎn)GBK原理也是一樣
return new String( s.getBytes("GBK") , "GBK");
其實(shí)核心工作都由 getBytes(charset) 做了。
getBytes 的JDK 描述:Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.
另外對于讀寫文件,
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("D:\\file.txt"),"UTF-8");
InputStreamReader( stream, charset)
可以幫助我們輕松的按照指定編碼讀寫文件。
“Java怎么進(jìn)行字符串編碼轉(zhuǎn)換”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!