站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

java出現(xiàn)亂碼的原因與解決方法詳解

java出現(xiàn)亂碼的原因與解決方法詳解

java在字符串中統(tǒng)一用Unicode表示。(推薦:java視頻教程)

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

如果源文件是GBK編碼,操作系統(tǒng)默認環(huán)境編碼也為GBK,那么編譯的時候,JVM將按照GBK編碼將字節(jié)數(shù)組解析為字符,然后將字符轉換為Unicode格式的字節(jié)數(shù)組,作為內(nèi)部存儲(字節(jié)數(shù)組→字符→Unicode字節(jié)數(shù)組)

當打印這個字符串時,JVM根據(jù)操作系統(tǒng)本地的語言環(huán)境,將Unicode轉換為GBK,然后操作系統(tǒng)將GBK格式的內(nèi)容顯示出來。

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

亂碼是如何產(chǎn)生的?

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

亂碼指的是程序顯示出來的字符文本無法用任何語言去解讀。一般情況下會包含大量的?。亂碼問題是所有計算機用戶或多或少會遇到的問題。

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

例如最常見的網(wǎng)頁亂碼問題。如果你是網(wǎng)站技術人員,遇到這樣的問題,需要檢查以下原因:

1、服務器返回的響應頭Content-Type沒有指明字符編碼

2、網(wǎng)頁內(nèi)是否使用META HTTP-EQUIV標簽指定了字符編碼

3、網(wǎng)頁文件本身存儲時使用的字符編碼和網(wǎng)頁聲明的字符編碼是否一致

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

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

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

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

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

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

那么,如何利用getBytes 和 new String() 來進行編碼轉換呢?

網(wǎng)上流傳著一種錯誤的方法:

GBK--> UTF-8: new String( s.getBytes("GBK") , "UTF-8);

這種方式是完全錯誤的,因為getBytes 的編碼與 UTF-8 不一致,肯定是亂碼。

但是為什么在tomcat 下,使用 new String(s.getBytes(“iso-8859-1”) ,”GBK”) 卻可以用呢?

答案是:

tomcat 默認使用iso-8859-1編碼, 也就是說,如果原本字符串是GBK的,tomcat傳輸過程中,將GBK轉成iso-8859-1了,默認情況下,使用iso-8859-1讀取中文肯定是有問題的。

那么我們需要將iso-8859-1 再轉成GBK, 而iso-8859-1 是單字節(jié)編碼的,即他認為一個字節(jié)是一個字符, 那么這種轉換不會對原來的字節(jié)數(shù)組做任何改變,因為字節(jié)數(shù)組本來就是由單個字節(jié)組成的。

如果之前用GBK編碼,那么轉成iso-8859-1后編碼內(nèi)容完全沒變, 則 s.getBytes(“iso-8859-1”) 實際上還是原來GBK的編碼內(nèi)容則 new String(s.getBytes(“iso-8859-1”) ,”GBK”) 就可以正確解碼了。 所以說這是一種巧合。

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

//利用getBytes將unicode字符串轉成UTF-8格式的字節(jié)數(shù)組,然后用utf-8 對這個字節(jié)數(shù)組解碼成新的字符串 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)

可以幫助我們輕松的按照指定編碼讀寫文件。

附錄:
HttpClient post請求中文亂碼問題解決

最近接到現(xiàn)場同事反饋,在掉接口的過程中,廠家收到的請求報文中文是亂碼的。我檢查了版控的代碼,找到如下解決辦法:

原始代碼(中文亂碼):

HttpPost httpPost = new HttpPost(url); DefaultHttpClient httpClient = new DefaultHttpClient(); //請求頭 httpPost.setHeader("Accept", MediaType.APPLICATION_JSON); httpPost.setHeader("Content-Type", "application/json;charset=UTF-8"); //請求實體 StringEntity reqEntity = new StringEntity(reqStr); httpPost.setEntity(reqEntity); //獲取響應 HttpResponse httpResp = httpClient.execute(httpPost); HttpEntity respEntity = httpResp.getEntity();

解決辦法:

方法一: //請求實體 HttpEntity reqEntity = new ByteArrayEntity(reqStr.getBytes("UTF-8")); //StringEntity reqEntity = new StringEntity(reqStr); httpPost.setEntity(reqEntity);  方法二: //請求實體 StringEntity reqEntity = new StringEntity(reqStr,Charset.forName("UTF-8")); httpPost.setEntity(reqEntity);

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
国内精品视频一区二区三区| 国产网站麻豆精品视频| 亚洲精品无码av天堂| 日韩人妻无码精品系列| 老牛精品亚洲成av人片| 亚洲熟妇成人精品一区| 国产精品久久久久久福利漫画| 无码人妻精品一区二区| 九九在线精品视频专区| 91麻豆精品国产自产在线观看一区| 成人精品在线视频| 亚洲日韩精品无码专区加勒比 | 精品人妻va出轨中文字幕| 国产精品天干天干综合网| 国产午夜亚洲精品午夜鲁丝片| 久久se精品一区二区影院| 国产A∨免费精品视频| 亚洲国产成人久久精品99| 香港aa三级久久三级老师2021国产三级精品三级在 | 亚洲午夜国产精品无码| 国产麻传媒精品国产AV| 国产精品麻花传媒二三区别| 亚洲av永久无码精品网址| 亚洲日韩精品无码专区加勒比| 亚洲日韩国产精品乱-久| 亚洲国产综合精品中文第一| 国产成人yy精品1024在线| 国产精品成人观看视频国产| 国产精品久久波多野结衣| 国产精品网址你懂的| 好吊妞视频这里只有精品| 在线综合亚洲中文精品| 精品动漫一区二区无遮挡| 亚洲AV无码成人精品区狼人影院| 亚洲爆乳无码精品AAA片蜜桃| 国产精品白丝AV在线观看播放| 精品国产日韩亚洲一区91| 国产精品特黄毛片| 丰满日韩放荡少妇无码视频| 日韩精品一线二线三线优势| 日韩精品免费一线在线观看|