java为什么全是乱码_java一切乱码的解释 以及源头
該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
InputStreamReader in = new InputStreamReader(new FileInputStream(“demo.txt”),”UTF-8”);
給InputStreamReader指定解碼編碼,這樣二者統一就不會出現亂碼了。
下面說說字符輸出流。
字符輸出流的原理和字符輸入流的原理一樣,也可以看做是包裝流,其底層還是采用字節輸出流來寫文件。只是字符輸出流根據指定的編碼將字符轉換為字節的。字符輸出流的主要類是:OutputStreamWriter。Java api解釋如下:OutputStreamWriter 是字符流通向字節流的橋梁:使用指定的 charset 將要向其寫入的字符編碼為字節。它使用的字符集可以由名稱指定或顯式給定,否則可能接受平臺默認的字符集。說的很明白了,它需要一個編碼將寫入的字符轉換為字節,如果沒有指定則采用GBK編碼,那么輸出的字節都將是GBK編碼,生成的文件也是GBK編碼的。如果采用以下方式構造OutputStreamWriter:
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(“dd.txt”),”UTF-8”);
那么寫入的字符將被編碼為UTF-8的字節,生成的文件也將是UTF-8格式的。
問題二: 既然讀文件要使用和文件編碼一致的編碼,那么javac編譯文件也需要讀取文件,它使用什么編碼呢?
這個問題從來就沒想過,也從沒當做是什么問題。正是因為問題一而引發的思考,其實這里還是有東西可以挖掘的。下面分三種情況來探討,這三種情況也是我們常用的編譯java源文件的方法。
1.javac在控制臺編譯java類文件。
通常我們手動建立一個java文件Demo.java,并保存。此時Demo.java文件的編碼為ANSI,中文操作系統下就是GBK.然后使用javac命令來編譯該源文件。”javac Demo.java”。Javac也需要讀取java文件,那么javac是使用什么編碼來解碼我們讀取的字節呢?其實javac采用了操作系統默認的GBK編碼解碼我們讀取的字節,這個編碼正好也是Demo.java文件的編碼,二者一致,所以不會出現亂碼情況。讓我們來做點手腳,在保存Demo.java文件時,我們選擇UTF-8保存。此時Demo.java文件編碼就是UTF-8了。我們再使用”javac Demo.java”來編譯,如果Demo.java里含有中文字符,此時控制臺會出現警告信息,也出現了亂碼。究其原因,就是因為javac采用了GBK編碼解碼我們讀取的字節。因為我們的字節是UTF-8編碼的,所以會出現亂碼。如果不信的話你可以自己試試。那么解決辦法呢?解決辦法就是使用javac的encoding參數來制定我們的解碼編碼。如下:javac -encoding UTF-8 Demo.java。這里我們指定了使用UTF-8來解碼讀取的字節,由于這個編碼和Demo.java文件編碼一致,所以不會出現亂碼情況了。
2.Eclipse中編譯java文件。
我習慣把Eclipse的編碼設置成UTF-8。那么每個項目中的java源文件的編碼就是UTF-8。這樣編譯也從沒有問題,也沒有出現過亂碼。正是因為這樣才掩蓋了使用javac可能出現的亂碼。那么Eclipse是如何正確編譯文件編碼為UTF-8的java源文件的呢?唯一的解釋就是Eclipse自動識別了我們java源文件的文件編碼,然后采取了正確的encoding參數來編譯我們的java源文件。功勞都歸功于IDE的強大了。
3.使用Ant來編譯java文件。
Ant也是我常用的編譯java文件的工具。首先,必須知道Ant在后臺其實也是采用javac來編譯java源文件的,那么可想而知,1會出現的問題在Ant中也會存在。如果我們使用Ant來編譯UTF-8編碼的java源文件,并且不指定如何編碼,那么也會出現亂碼的情況。所以Ant的編譯命令有一個屬性” encoding”允許我們指定編碼,如果我們要編譯源文件編碼為UTF-8的java文件,那么我們的命令應該如下:
指定了編碼也就相當于”javac –encoding”了,所以不會出現亂碼了。
總結
以上是生活随笔為你收集整理的java为什么全是乱码_java一切乱码的解释 以及源头的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: icp备案查询(isp备案)
- 下一篇: java+map对象判断空值_java判