java 中的亂碼問題匯總及解決方案
java中的亂碼問題
最近做項(xiàng)目經(jīng)常會(huì)遇到Java中的亂碼問題,于是就抽時(shí)間整理下出現(xiàn)亂碼問題的情況和如何處理,這里做了一個(gè)整理,
分析
編碼與解碼
編碼就是將字符轉(zhuǎn)為字節(jié),解碼就是就是將字節(jié)轉(zhuǎn)換為字符。
字節(jié)流與字符流
對(duì)文件的讀寫操作都是通過字節(jié)流來實(shí)現(xiàn)的,即使JAVA中有字符流,但是其底層仍然使用的字節(jié)流。
亂碼問題出現(xiàn)
java中使用最頻繁的是字符,當(dāng)我們將文件讀入內(nèi)存并在控制臺(tái)顯示時(shí)(字節(jié)流--->字符流),就需要用到解碼。如果文件是UTF-8編碼,而我們解碼時(shí)錯(cuò)用成GBK(如果不指定編碼,JAVA會(huì)采取系統(tǒng)默認(rèn)編碼)來解碼,那么只能顯示亂碼。而我們寫文件時(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
直接通過字節(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),我們并沒有去設(shè)置編碼,這是因?yàn)镕ileReader中采用了默認(rèn)編碼方式。這就變得很危險(xiǎn)了,如果其默認(rèn)的編碼格式和我們文件的編碼不同,那么讀出來的數(shù)據(jù)一定是亂碼。所以我們最好采用示例中的方式來進(jìn)行流的轉(zhuǎn)換。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
使用spring的restTemplate注意點(diǎn)
這篇文章主要介紹了使用spring的restTemplate注意點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10springboot使用war包部署到外部tomcat過程解析
這篇文章主要介紹了springboot使用war包部署到外部tomcat過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01使用Springboot自定義注解,支持SPEL表達(dá)式
這篇文章主要介紹了使用Springboot自定義注解,支持SPEL表達(dá)式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02SpringCloud 服務(wù)網(wǎng)關(guān)路由規(guī)則的坑及解決
這篇文章主要介紹了SpringCloud 服務(wù)網(wǎng)關(guān)路由規(guī)則的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07基于Java SSM框架開發(fā)圖書借閱系統(tǒng)源代碼
本文給大家介紹了基于Java SSM框架開發(fā)圖書借閱系統(tǒng),開發(fā)環(huán)境基于idea2020+mysql數(shù)據(jù)庫,前端框架使用bootstrap4框架,完美了實(shí)現(xiàn)圖書借閱系統(tǒng),喜歡的朋友快來體驗(yàn)吧2021-05-05