国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 Java Java基礎 java出現(xiàn)亂碼的原因與解決方法詳解

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

Nov 28, 2019 am 10:11 AM
java 亂碼

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

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

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

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

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

當源碼文件是UTF-8, 我們需要通知編譯器源碼的格式,javac -encoding utf-8 … , 編譯時,JVM按照utf-8 解析成字符,然后轉(zhuǎn)換為unicode格式的字節(jié)數(shù)組, 那么不論源碼文件是什么格式,同樣的字符串,最后得到的unicode字節(jié)數(shù)組是完全一致的,顯示的時候,也是轉(zhuǎn)成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轉(zhuǎn)換為操作系統(tǒng)默認格式的字節(jié)數(shù)組,即“測試字符串”的GBK格式,new String (bytes, Charset) 中的charset 是指定讀取byte的方式,這里指定為UTF-8,即把bytes的內(nèi)容當做UTF-8來讀取。

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

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

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

網(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轉(zhuǎn)成iso-8859-1了,默認情況下,使用iso-8859-1讀取中文肯定是有問題的。

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

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

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

//利用getBytes將unicode字符串轉(zhuǎn)成UTF-8格式的字節(jié)數(shù)組,然后用utf-8 對這個字節(jié)數(shù)組解碼成新的字符串
new String( s.getBytes("utf-8") , "utf-8");

UTF-8 轉(zhuǎn)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);

更多java知識請關注java基礎教程欄目。

以上是java出現(xiàn)亂碼的原因與解決方法詳解的詳細內(nèi)容。更多信息請關注PHP中文網(wǎng)其他相關文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務,必須先關閉自動提交模式,再執(zhí)行多個操作,最后根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務;2.執(zhí)行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時應使用try-with-resources管理資源,妥善處理異常并關閉連接,避免連接泄漏;此外建議使用連接池、設置保存點實現(xiàn)部分回滾,并保持事務盡可能短以提升性能。

如何使用Java的日歷? 如何使用Java的日歷? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

了解網(wǎng)絡端口和防火墻 了解網(wǎng)絡端口和防火墻 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動管理內(nèi)存的機制,通過回收不可達對象釋放堆內(nèi)存,減少內(nèi)存泄漏風險。1.GC從根對象(如棧變量、活動線程、靜態(tài)字段等)出發(fā)判斷對象可達性,無法到達的對象被標記為垃圾。2.基于標記-清除算法,標記所有可達對象,清除未標記對象。3.采用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時較長的MajorGC;Metaspace存儲類元數(shù)據(jù)。4.JVM提供多種GC器:SerialGC適用于小型應用;ParallelGC提升吞吐量;CMS降

比較Java構建工具:Maven vs. Gradle 比較Java構建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

以身作則,解釋說明 以身作則,解釋說明 Aug 02, 2025 am 06:26 AM

defer用于在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時立即求值,函數(shù)按后進先出(LIFO)順序執(zhí)行;1.多個defer按聲明逆序執(zhí)行;2.常用于文件關閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會執(zhí)行,適合用于recover;5.避免在循環(huán)中濫用defer,防止資源泄漏;正確使用可提升代碼安全性和可讀性。

使用HTML'輸入類型”作為用戶數(shù)據(jù) 使用HTML'輸入類型”作為用戶數(shù)據(jù) Aug 03, 2025 am 11:07 AM

選擇合適的HTMLinput類型能提升數(shù)據(jù)準確性、增強用戶體驗并提高可用性。1.根據(jù)數(shù)據(jù)類型選用對應input類型,如text、email、tel、number和date,可實現(xiàn)自動校驗和適配鍵盤;2.利用HTML5新增類型如url、color、range和search,可提供更直觀的交互方式;3.配合使用placeholder和required屬性,可提升表單填寫效率和正確率,但需注意placeholder不能替代label。

See all articles