A. java 用FileInputStream中read方法讀取文件出現亂碼
read方法讀取復的是位元組流(制每次讀取一個位元組),如果是中文,就是兩個位元組,就會出現亂碼的。
可以通過BufferedReader 流的形式進行流緩存,之後通過readLine方法獲取到緩存的內容。
BufferedReader bre = null;
try {
String file = "D:/test/test.txt";
bre = new BufferedReader(new FileReader(file));//此時獲取到的bre就是整個文件的緩存流
while ((str = bre.readLine())!= null) // 判斷最後一行不存在,為空結束循環
{
System.out.println(str);//原樣輸出讀到的內容
};
備註: 流用完之後必須close掉,如上面的就應該是:bre.close(),否則bre流會一直存在,直到程序運行結束。
B. mysql資料庫中存進的是中文,為什麼查出來的亂碼
一、轉碼失敗
在數據寫入到表的過程中轉碼失敗,資料庫端也沒有進行恰當的處理,導致存放在表裡的數據亂碼。
針對這種情況,前幾篇文章介紹過客戶端發送請求到服務端。
其中任意一個編碼不一致,都會導致表裡的數據存入不正確的編碼而產生亂碼。
比如下面簡單一條語句:
set @a = "文本字元串";
insert into t1 values(@a);
變數 @a 的字元編碼是由參數 CHARACTER_SET_CLIENT 決定的,假設此時編碼為 A,也就是變數 @a 的編碼。
2. 寫入語句在發送到 MySQL 服務端之前的編碼由 CHARACTER_SET_CONNECTION 決定,假設此時編碼為 B。
3. 經過 MySQL 一系列詞法,語法解析等處理後,寫入到表 t1,表 t1 的編碼為 C。
那這里編碼 A、編碼 B、編碼 C 如果不兼容,寫入的數據就直接亂碼。
二、客戶端亂碼
表數據正常,但是客戶端展示後出現亂碼。
這一類場景,指的是從 MySQL 表裡拿數據出來返回到客戶端,MySQL 里的數據本身沒有問題。客戶端發送請求到 MySQL,表的編碼為 D,從 MySQL 拿到記錄結果傳輸到客戶端,此時記錄編碼為 E(CHARACTER_SET_RESULTS)。
那以上編碼 E 和 D 如果不兼容,檢索出來的數據就看起來亂碼了。但是由於數據本身沒有被破壞,所以換個兼容的編碼就可以獲取正確的結果。
這一類又分為以下三個不同的小類:
1)欄位編碼和表一致,客戶端是不同的編碼
比如下面例子, 表數據的編碼是 utf8mb4,而 SESSION 1 發起的連接編碼為 gbk。那由於編碼不兼容,檢索出來的數據肯定為亂碼。
2)表編碼和客戶端的編碼一致,但是記錄之間編碼存在不一致的情形
比如表編碼是 utf8mb4,應用端編碼也是 utf8mb4,但是表裡的數據可能一半編碼是 utf8mb4,另外一半是 gbk。那麼此時表的數據也是正常的,不過此時採用哪種編碼都讀不到所有完整的數據。這樣數據產生的原因很多,比如其中一種可能性就是表編碼多次變更而且每次變更不徹底導致(變更不徹底,我之前的篇章里有介紹)。舉個例子,表 t3 的編碼之前是 utf8mb4,現在是 gbk,而且兩次編碼期間都被寫入了正常的數據。
3)每個欄位的編碼不一致,導致亂碼和第二點一樣的場景。不同的是:非記錄間的編碼不統一,而是每個欄位編碼不統一。舉個例子,表 c1 欄位 a1,a2。a1 編碼 gbk,a2 編碼是 utf8mb4。那每個欄位單獨讀出來數據是完整的,但是所有欄位一起讀出來,數據總會有一部分亂碼。
三、LATIN1
還有一種情形就是以 LATIN1 的編碼存儲數據
估計大家都知道字元集 LATIN1,LATIN1 對所有字元都是單位元組流處理,遇到不能處理的位元組流,保持原樣,那麼在以上兩種存入和檢索的過程中都能保證數據一致,所以 MySQL 長期以來默認的編碼都是 LATIN1。這種情形,看起來也沒啥不對的點,數據也沒亂碼,那為什麼還有選用其他的編碼呢?原因就是對字元存儲的位元組數不一樣,比如 emoji 字元 "❤",如果用 utf8mb4 存儲,佔用 3 個位元組,那 varchar(12) 就能存放 12 個字元,但是換成 LATIN1,只能存 4 個字元。
C. java列印中文亂碼
java控制台中文輸出亂碼,已經注意文件格式和控制台格式了?不要用系統寫字板notepad保存UTF8的Java源文件。M$的UTF8是UTF8withBOM,而Java編譯器識別的UTF8是UTF8withoutBOM,兩者不兼容。
eclipse中java中文控制台輸出的這種亂碼解決方式:(1)打開eclipse或myeclipse,點擊run-》runconfigurations如圖提示,改成UTF-8,有的eclipse或myeclipse有可能需要gbk的形式,不同形式改成不同的編碼,嘗試一下即可。
設置單個文件的編碼:只是個別文件出現了亂碼,那麼設置個別文件的編碼格式就可以解決問題了。選中有亂碼的文件,然後點擊右鍵。在彈出的菜單中選擇屬性(Properties)。
java中輸入輸出中文亂碼,怎麼辦?1、在代碼區域右鍵-runas-runconfigurations-common(右側)-consoleencoding如果出現此錯誤,此時的編碼格式應該是UTF-8,選擇Other,這時可能沒有GBK選項,如果沒有,則執行之後操作。
2、讀取文件的時候如果是用的read方法(位元組流),碰到中文輸出就是亂碼,然後存儲的時候設置下編碼為GBK或者是UTF-8形式即可,可以有效的解決亂碼問題。
3、java文件讀取的時候有中文就很出現亂碼,通常獲取到的文件中通常都是「iso8859-1」格式,需要轉換為「UTF-8」格式。
Java程序輸出txt文件內容時中文亂碼怎麼解決?
解決辦法:在代碼區域右鍵-runas-runconfigurations-common(右側)-consoleencoding如果出現此錯誤,此時的編碼格式應該是UTF-8,選擇Other,這時可能沒有GBK選項,如果沒有,則執行之後操作。
txt文檔一般是GBK編碼格式的,你可以將它另存一下,改為Utf-8格式,你也可以將你的開發工具調成GBK編碼格式,總之就是將你的開發環境的編碼格式與你要讀取的txt文件的編碼格式調成一致的。
讀取文件的時候如果是用的read方法(位元組流),碰到中文輸出就是亂碼,然後存儲的時候設置下編碼為GBK或者是UTF-8形式即可,可以有效的解決亂碼問題。
把txt文件重新另存為時選擇編碼為與編輯器IED的編碼一致,比如我IntellijIDEA的編輯器右下角顯示為utf-8,然後把要讀取的txt文件另存為的時候編碼選項選擇utf-8,再次運行程序時,就能顯示中文。
只是個別文件出現了亂碼,那麼設置個別文件的編碼格式就可以解決問題了。選中有亂碼的文件,然後點擊右鍵。在彈出的菜單中選擇屬性(Properties)。
eclipse中java中文控制台輸出的這種亂碼怎麼解決解決方法其實很簡單,設置一下編碼就行了。打開Eclipse,右鍵點擊項目文件,然後點擊最下方的屬性。
進行再textfileencoding進行勾選上default的選項即可。
這不是亂碼,原因很明顯,索引String數組錯誤,將最後一個for循環裡面的zfc改成zfc[j]即可。
改變整個工作空間的編碼格式,這樣以後新建的文件也是新設置的編碼格式。
為什麼我用sublime寫java代碼時列印中文列印出來是亂碼?請問大神編碼...1、點擊「preferences」菜單,選擇「BrowsePackages」打開插件所在目錄,找到「java」這一項,雙擊打開。後綴名為sublime-build的文件是編譯程序的命令,找到JavaC.sublime-build,拖入SublimeText2打開進行編輯。
2、產生原因:因為這個開源項目的默認字元編碼不對,所以控制台的字元編碼也自動變成了UTF-8,而鍵盤的輸入流的默認格式是GBK格式,這樣就造成了在GBK轉UTF-8的過程中產生的奇數亂碼錯誤(這個問題的解釋可以在搜索引擎找到)。
3、SublimeText軟體中,用這款代碼編輯器打開某個GB2312和GBK編碼的文件時,大家可能會遇到中文顯示亂碼的情況,這是因為SublimeText軟體默認的不支持GB2312和GBK編碼格式,想要它能夠正常顯示中文就需要在軟體中安裝一個中文插件包。
4、字元編碼問題:ide下設成utf-8命令行下檢查字元頁設置對不對。修改cmd窗口字元編碼為UTF-8,命令行中執行:chcp65001切換回中文:chcp936這兩條命令只在當前窗口生效,重啟後恢復之前的編碼。
5、SublimeText2目前還不支持gbk編碼,UTF-8完美支持。因此,你的文件出現中文亂碼應該是打開gbk編碼的文件,你可以用系統的記事本直接另存為UTF-8編碼的。
6、java文件讀取的時候有中文就很出現亂碼,通常獲取到的文件中通常都是「iso8859-1」格式,需要轉換為「UTF-8」格式。
D. java中位元組流和字元流讀取的問題(有圖)
不在於是否來位元組流還是字源符流,因為字元流其實也是要經過位元組流轉換而來的。出現亂碼的原因是編碼方式不一致。
例如:
系統編碼是GBK,文件編碼是UTF-8,java讀取文件時,就會以GBK的編碼方式讀取UTF-8的文件,因為兩者的編碼方式不一樣,導致亂碼(GBK用兩個位元組表示字元,最高位1,UTF-8當英文時用一個位元組表示,中文時3個位元組表示),所以當java以GBK的編碼方式讀取UTF-8的文件時就會對接不上從而導致亂碼。
根本原因是編碼方式不一致,字元流,位元組流都不關事。因為java讀取的時候,是先確定編碼方式後,才會根據編碼方式去解析文件,確定編碼方式是前提,位元組流,字元流一樣都是要先確定編碼方式的,既然編碼方式不一致了,那就肯定會亂碼,無論是位元組流還是字元流。
E. 在java中怎樣處理中文亂碼的問題(有幾種處理方式)
讀取文件的時候如果是用的read方法(位元組流),碰到中文輸出就是亂碼,然後存儲的時候設置下編碼為GBK或者是UTF-8形式即可,可以有效的解決亂碼問題。
可以通過BufferedReader 流的形式進行流緩存,之後通過readLine方法獲取到緩存的內容。
BufferedReader bre = null;
try {
String file = "D:/test/test.txt";
bre = new BufferedReader(new FileReader(file));//此時獲取到的bre就是整個文件的緩存流
while ((str = bre.readLine())!= null) // 判斷最後一行不存在,為空結束循環
{
System.out.println(str);//原樣輸出讀到的內容
};
備註: 流用完之後必須close掉,如上面的就應該是:bre.close(),否則bre流會一直存在,直到程序運行結束。
可以通過「FileOutputStream」創建文件實例,之後過「OutputStreamWriter」流的形式進行存儲,舉例:
OutputStreamWriter pw = null;//定義一個流
pw = new OutputStreamWriter(new FileOutputStream(「D:/test.txt」),"GBK");//確認流的輸出文件和編碼格式,此過程創建了「test.txt」實例
pw.write("我是要寫入到記事本文件的內容");//將要寫入文件的內容,可以多次write
pw.close();//關閉流
備註:文件流用完之後必須及時通過close方法關閉,否則會一直處於打開狀態,直至程序停止,增加系統負擔。
F. Java中有幾種類型的流
位元組流,字元流。位元組流繼承於InputStream、OutputStream,字元流繼承於InputStreamReader、
OutputStreamWriter。在java.io包中還有許多其他回的流,主要是為了提高答性能和使用方便。