溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么進行字符串編碼轉換

發(fā)布時間:2021-11-30 15:05:48 來源:億速云 閱讀:217 作者:iii 欄目:大數(shù)據

本篇內容介紹了“Java怎么進行字符串編碼轉換”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

       字符串在java中統(tǒng)一用unicode表示( 即utf-16 LE) , 對于 String s = "你好哦!";如果源碼文件是GBK編碼, 操作系統(tǒng)(windows)默認的環(huán)境編碼為GBK,那么編譯時,  JVM將按照GBK編碼將字節(jié)數(shù)組解析成字符,然后將字符轉換為unicode格式的字節(jié)數(shù)組,作為內部存儲。當打印這個字符串時,JVM 根據操作系統(tǒng)本地的語言環(huán)境,將unicode轉換為GBK,然后操作系統(tǒng)將GBK格式的內容顯示出來。
 
     當源碼文件是UTF-8, 我們需要通知編譯器源碼的格式,javac -encoding utf-8 ... , 編譯時,JVM按照utf-8 解析成字符,然后轉換為unicode格式的字節(jié)數(shù)組, 那么不論源碼文件是什么格式,同樣的字符串,最后得到的unicode字節(jié)數(shù)組是完全一致的,顯示的時候,也是轉成GBK來顯示(跟OS環(huán)境有關)
 
亂碼如何產生?本質上都是由于字符串原本的編碼格式與讀取時解析用的編碼格式不一致導致的。
例如:String s = "你好哦!";
     System.out.println( new String(s.getBytes(),"UTF-8")); //錯誤,因為getBytes()默認使用GBK編碼, 而解析時使用UTF-8編碼,肯定出錯。
       其中 getBytes() 是將unicode 轉換為操作系統(tǒng)默認的格式的字節(jié)數(shù)組,即"你好哦"的 GBK格式,new String (bytes, Charset) 中的charset 是指定讀取 bytes 的方式,這里指定為UTF-8,即把bytes的內容當做UTF-8 格式對待。
      如下兩種方式都會有正確的結果,因為他們的源內容編碼和解析用的編碼是一致的。
    System.out.println( new String(s.getBytes(),"GBK"));
    System.out.println( new String(s.getBytes("UTF-8"),"UTF-8"));
 
         那么,如何利用getBytes 和 new String() 來進行編碼轉換呢?  網上流傳著一種錯誤的方法:GBK--> UTF-8:    new String( s.getBytes("GBK") , "UTF-8);   ,這種方式是完全錯誤的,因為getBytes 的編碼與  UTF-8 不一致,肯定是亂碼。但是為什么在tomcat 下,使用new String(s.getBytes("iso-8859-1") ,"GBK") 卻可以用呢? 

答案是:tomcat 默認使用iso-8859-1編碼, 也就是說,如果原本字符串是GBK的,tomcat傳輸過程中,將GBK轉成iso-8859-1了,默認情況下,使用iso-8859-1讀取中文肯定是有問題的,那么我們需要將iso-8859-1 再轉成GBK, 而iso-8859-1 是單字節(jié)編碼的,即他認為一個字節(jié)是一個字符, 那么這種轉換不會對原來的字節(jié)數(shù)組做任何改變,因為字節(jié)數(shù)組本來就是由單個字節(jié)組成的,如果之前用GBK編碼,那么轉成iso-8859-1后編碼內容完全沒變, 則 s.getBytes("iso-8859-1")  實際上還是原來GBK的編碼內容;則 new String(s.getBytes("iso-8859-1") ,"GBK")  就可以正確解碼了。 所以說這是一種巧合。
 
如何正確的將GBK轉UTF-8 ? (實際上是unicode轉UTF-8)
         String gbkStr = "你好哦!"; //源碼文件是GBK格式,或者這個字符串是從GBK文件中讀取出來的, 轉換為string 變成unicode格式
//利用getBytes將unicode字符串轉成UTF-8格式的字節(jié)數(shù)組
        byte[] utf8Bytes = gbkStr.getBytes("UTF-8"); 
//然后用utf-8 對這個字節(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 轉GBK原理也是一樣
    return new String( s.getBytes("GBK") , "GBK");
 
 其實核心工作都由  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怎么進行字符串編碼轉換”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI