溫馨提示×

溫馨提示×

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

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

怎么防止java程序出現亂碼

發布時間:2020-06-24 09:10:55 來源:億速云 閱讀:162 作者:Leah 欄目:編程語言

怎么防止java程序出現亂碼?可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

java在字符串中統一用Unicode表示。

對于任意一個字符串:String string = “測試字符串”;

如果源文件是GBK編碼,操作系統默認環境編碼也為GBK,那么編譯的時候,JVM將按照GBK編碼將字節數組解析為字符,然后將字符轉換為Unicode格式的字節數組,作為內部存儲(字節數組→字符→Unicode字節數組)。

當打印這個字符串時,JVM根據操作系統本地的語言環境,將Unicode轉換為GBK,然后操作系統將GBK格式的內容顯示出來。

當源碼文件是UTF-8, 我們需要通知編譯器源碼的格式,javac -encoding utf-8 … , 編譯時,JVM按照utf-8 解析成字符,然后轉換為unicode格式的字節數組, 那么不論源碼文件是什么格式,同樣的字符串,最后得到的unicode字節數組是完全一致的,顯示的時候,也是轉成GBK來顯示(跟OS環境有關)

亂碼是如何產生的?

本質上都是由于字符串原本的編碼格式與讀取時解析用的編碼格式不一致導致的。

造成亂碼的原因就是因為使用了錯誤的字符編碼去解碼字節流,因此當我們在思考任何跟文本顯示有關的問題時,請時刻保持清醒:當前使用的字符編碼是什么,只有這樣,我們才能正確分析和處理亂碼問題。

java代碼中的亂碼問題如何解決呢?

例如:String s = “測試字符串”;

System.out.println( new String(s.getBytes(),"UTF-8")); 
//錯誤,因為getBytes()默認使用GBK編碼, 而解析時使用UTF-8編碼,肯定出錯。

其中getBytes()是將Unicode轉換為操作系統默認格式的字節數組,即“測試字符串”的GBK格式,new String (bytes, Charset) 中的charset 是指定讀取byte的方式,這里指定為UTF-8,即把bytes的內容當做UTF-8來讀取。

如下兩種方式得到的結果都是正確的,因為它們的源內容編碼和解析用的編碼是一致的。

System.out.println( new String(s.getBytes(),"GBK"));
System.out.println( new String(s.getBytes("UTF-8"),"UTF-8"));

如何正確的將GBK轉UTF-8 ? (實際上是unicode轉UTF-8)

//利用getBytes將unicode字符串轉成UTF-8格式的字節數組,然后用utf-8 對這個字節數組解碼成新的字符串
new String( s.getBytes("utf-8") , "utf-8");

UTF-8 轉GBK原理也是一樣

new String( s.getBytes("GBK") , "GBK");

其實核心工作都由getBytes(charset)做了。getBytes的JDK描述:Encoding this String into a sequence of bytes using the named charset,storing the result into a new byte array.

OutputStreamWriter w1 = new OutputStreamWriter(new FileOutputStream("D:\\file1.txt"),"UTF-8");
InputStreamReader( stream, charset)

看完上述內容,你們對防止java程序出現亂碼的方法有進一步的了解嗎?如果還想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。

向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女