java 中的亂碼問(wèn)題匯總及解決方案
java中的亂碼問(wèn)題
最近做項(xiàng)目經(jīng)常會(huì)遇到Java中的亂碼問(wèn)題,于是就抽時(shí)間整理下出現(xiàn)亂碼問(wèn)題的情況和如何處理,這里做了一個(gè)整理,
分析
編碼與解碼
編碼就是將字符轉(zhuǎn)為字節(jié),解碼就是就是將字節(jié)轉(zhuǎn)換為字符。
字節(jié)流與字符流
對(duì)文件的讀寫操作都是通過(guò)字節(jié)流來(lái)實(shí)現(xiàn)的,即使JAVA中有字符流,但是其底層仍然使用的字節(jié)流。
亂碼問(wèn)題出現(xiàn)
java中使用最頻繁的是字符,當(dāng)我們將文件讀入內(nèi)存并在控制臺(tái)顯示時(shí)(字節(jié)流--->字符流),就需要用到解碼。如果文件是UTF-8編碼,而我們解碼時(shí)錯(cuò)用成GBK(如果不指定編碼,JAVA會(huì)采取系統(tǒng)默認(rèn)編碼)來(lái)解碼,那么只能顯示亂碼。而我們寫文件時(shí),最好指定編碼(UTF-8)。
解決方案
示例1
將字節(jié)流轉(zhuǎn)換為字符流時(shí),我們指定編碼格式。這是我們文件也應(yīng)該是gb2312編碼
public static String read(String filename) throws Exception {
InputStream is = new FileInputStream(filename);
BufferedReader in = new BufferedReader(new InputStreamReader(is,
"gb2312")); //指定編碼格式
String s;
StringBuilder sb = new StringBuilder();
while ((s = in.readLine()) != null) {
sb.append(s + "\n");
}
in.close();
return sb.toString();
}
示例2
直接通過(guò)字節(jié)流讀入,使用String轉(zhuǎn)換為字符時(shí),指定編碼。
package com.dy.xidian;
import java.io.FileInputStream;
import java.io.InputStream;
class BufferedInputFile {
public static String read(String filename) throws Exception {
@SuppressWarnings("resource")
InputStream is = new FileInputStream(filename);
byte[] b = new byte[1024];
is.read(b);
return new String(b, "gb2312");
}
}
public class MemoryInput {
public static void main(String[] args) throws Exception {
String filename = "E:/html/gb2312.php";
String s = BufferedInputFile.read(filename);
System.out.println(s);
}
}
陷阱
I/O操作中有個(gè)FileReader類,這個(gè)類隱藏了字節(jié)流轉(zhuǎn)為字符流的細(xì)節(jié),我們可以這樣使用。 BufferedReader in = new BufferedReader(new FileReader(filename)); 這樣,我們直接得到就是字符流了。但我們發(fā)現(xiàn),我們并沒(méi)有去設(shè)置編碼,這是因?yàn)镕ileReader中采用了默認(rèn)編碼方式。這就變得很危險(xiǎn)了,如果其默認(rèn)的編碼格式和我們文件的編碼不同,那么讀出來(lái)的數(shù)據(jù)一定是亂碼。所以我們最好采用示例中的方式來(lái)進(jìn)行流的轉(zhuǎn)換。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Spring MVC 接口 ResponseBodyAdvice 及其應(yīng)用最佳實(shí)
ResponseBodyAdvice?是 Spring MVC 提供的一個(gè)強(qiáng)大接口,允許你在響應(yīng)體被寫入 HTTP 響應(yīng)之前對(duì)其進(jìn)行全局處理,下面我將全面介紹它的工作原理、使用場(chǎng)景和最佳實(shí)踐,感興趣的朋友一起看看吧2025-04-04
JAVA實(shí)現(xiàn)異步調(diào)用實(shí)例代碼
在java平臺(tái),實(shí)現(xiàn)異步調(diào)用的角色主要三種角色:調(diào)用者、取貨憑證、真實(shí)數(shù)據(jù)。本篇文章給大家介紹java實(shí)現(xiàn)異步調(diào)用實(shí)例代碼,需要的朋友可以參考下2015-09-09
Java 開(kāi)發(fā)的幾個(gè)注意點(diǎn)總結(jié)
這篇文章主要介紹了Java開(kāi)發(fā)的幾個(gè)注意點(diǎn)的相關(guān)資料,需要的朋友可以參考下2016-09-09
深度對(duì)比與解析SpringBoot中的application.properties與application.yml
在Springboot項(xiàng)目中,使用.properties和.yml配置是等效的,均可以正常識(shí)別并使用,本文將為大家深入對(duì)比與解析一下二者的使用與區(qū)別,希望對(duì)大家有一定的幫助2025-04-04
Java解決浮點(diǎn)數(shù)計(jì)算不精確問(wèn)題的方法詳解
在 Java 中,浮點(diǎn)數(shù)計(jì)算不精確問(wèn)題指的是使用浮點(diǎn)數(shù)進(jìn)行運(yùn)算時(shí),由于浮點(diǎn)數(shù)的內(nèi)部表示方式和十進(jìn)制數(shù)的表示方式存在差異,導(dǎo)致計(jì)算結(jié)果可能出現(xiàn)誤差,本文就給大家介紹一下Java如何解決浮點(diǎn)數(shù)計(jì)算不精確問(wèn)題,需要的朋友可以參考下2023-09-09
javacv-ffmpeg ProcessBuilder批量旋轉(zhuǎn)圖片方式
為了批量處理大量圖片的旋轉(zhuǎn),可以使用javacv-ffmpeg結(jié)合ProcessBuilder,首先在maven配置文件中添加ffmpeg及javacpp依賴,javacpp支持調(diào)用C/C++方法,而ffmpeg基于C語(yǔ)言,使用ProcessBuilder創(chuàng)建進(jìn)程調(diào)用ffmpeg方法2024-09-09

