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

ホームページ Java &#&ベース Javaの文字化けの原因と解決策を詳しく解説

Javaの文字化けの原因と解決策を詳しく解説

Nov 28, 2019 am 10:11 AM
java 文字化け

Javaの文字化けの原因と解決策を詳しく解説

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

對(duì)于任意一個(gè)字符串:String string = “測(cè)試字符串”;

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

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

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

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

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

亂碼指的是程序顯示出來(lái)的字符文本無(wú)法用任何語(yǔ)言去解讀。一般情況下會(huì)包含大量的?。亂碼問(wèn)題是所有計(jì)算機(jī)用戶(hù)或多或少會(huì)遇到的問(wèn)題。

造成亂碼的原因就是因?yàn)槭褂昧隋e(cuò)誤的字符編碼去解碼字節(jié)流,因此當(dāng)我們?cè)谒伎既魏胃谋撅@示有關(guān)的問(wèn)題時(shí),請(qǐng)時(shí)刻保持清醒:當(dāng)前使用的字符編碼是什么。只有這樣,我們才能正確分析和處理亂碼問(wèn)題。

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

1、服務(wù)器返回的響應(yīng)頭Content-Type沒(méi)有指明字符編碼

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

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

java代碼中的亂碼問(wèn)題如何解決呢?

例如:String s = “測(cè)試字符串”;

System.out.println( new String(s.getBytes(),"UTF-8")); 
//錯(cuò)誤,因?yàn)間etBytes()默認(rèn)使用GBK編碼, 而解析時(shí)使用UTF-8編碼,肯定出錯(cuò)。

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

如下兩種方式得到的結(jié)果都是正確的,因?yàn)樗鼈兊脑磧?nèi)容編碼和解析用的編碼是一致的。

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

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

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

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

這種方式是完全錯(cuò)誤的,因?yàn)間etBytes 的編碼與 UTF-8 不一致,肯定是亂碼。

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

答案是:

tomcat 默認(rèn)使用iso-8859-1編碼, 也就是說(shuō),如果原本字符串是GBK的,tomcat傳輸過(guò)程中,將GBK轉(zhuǎn)成iso-8859-1了,默認(rèn)情況下,使用iso-8859-1讀取中文肯定是有問(wèn)題的。

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

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

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

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

UTF-8 轉(zhuǎn)GBK原理也是一樣
new String( s.getBytes("GBK") , "GBK");

其實(shí)核心工作都由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)

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

附錄:
HttpClient post請(qǐng)求中文亂碼問(wèn)題解決

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

原始代碼(中文亂碼):

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

解決辦法:

方法一:
//請(qǐng)求實(shí)體
HttpEntity reqEntity = new ByteArrayEntity(reqStr.getBytes("UTF-8"));
//StringEntity reqEntity = new StringEntity(reqStr);
httpPost.setEntity(reqEntity);

方法二:
//請(qǐng)求實(shí)體
StringEntity reqEntity = new StringEntity(reqStr,Charset.forName("UTF-8"));
httpPost.setEntity(reqEntity);

更多java知識(shí)請(qǐng)關(guān)注java基礎(chǔ)教程欄目。

以上がJavaの文字化けの原因と解決策を詳しく解説の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫(huà)像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫(xiě)真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫(xiě)真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類(lèi)リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JDBCを使用してJavaのトランザクションを処理する方法は? JDBCを使用してJavaのトランザクションを処理する方法は? Aug 02, 2025 pm 12:29 PM

JDBCトランザクションを正しく処理するには、最初に自動(dòng)コミットモードをオフにし、次に複數(shù)の操作を?qū)g行し、結(jié)果に応じて最終的にコミットまたはロールバックする必要があります。 1。CONN.SETAUTOCOMMIT(FALSE)を呼び出して、トランザクションを開(kāi)始します。 2。挿入や更新など、複數(shù)のSQL操作を?qū)g行します。 3。すべての操作が成功した場(chǎng)合はconn.commit()を呼び出し、データの一貫性を確保するために例外が発生した場(chǎng)合はconn.rollback()を呼び出します。同時(shí)に、リソースを使用してリソースを管理し、例外を適切に処理し、接続を密接に接続するために、接続の漏れを避けるために使用する必要があります。さらに、接続プールを使用してセーブポイントを設(shè)定して部分的なロールバックを達(dá)成し、パフォーマンスを改善するためにトランザクションを可能な限り短く保つことをお?jiǎng)幛幛筏蓼埂?/p>

Java仮想マシン(JVM)內(nèi)部の理解 Java仮想マシン(JVM)內(nèi)部の理解 Aug 01, 2025 am 06:31 AM

thejvmenablesjavaの「writeonce、runany where "capabilitybyexcuting byteCodeThethermainComponents:1。theClassLoaderSubSystemloads、links、andinitializes.classfilesusingbootStrap、拡張、およびアプリケーションクラスローロー、

Javaでカレンダーを操作する方法は? Javaでカレンダーを操作する方法は? Aug 02, 2025 am 02:38 AM

Java.Timeパッケージのクラスを使用して、古い日付とカレンダーのクラスを置き換えます。 2。LocalDate、LocalDateTime、LocalTimeを通じて現(xiàn)在の日付と時(shí)刻を取得します。 3。of()メソッドを使用して特定の日付と時(shí)刻を作成します。 4.プラス/マイナスメソッドを使用して、時(shí)間を不正に増加させて短縮します。 5. ZonedDateTimeとZoneIDを使用して、タイムゾーンを処理します。 6。DateTimeFormatterを介したフォーマットおよび解析の文字列。 7.インスタントを使用して、必要に応じて古い日付型と互換性があります?,F(xiàn)代のJavaでの日付処理は、java.timeapiを使用することを優(yōu)先する必要があります。

Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pre-formanceTartuptimeMemoryusage、quarkusandmicronautleadduetocopile-timeprocessingingandgraalvsupport、withquarkusoftentylightbetterine serverlessシナリオ。

ネットワークポートとファイアウォールの理解 ネットワークポートとファイアウォールの理解 Aug 01, 2025 am 06:40 AM

ネットワークポートアンドファイアワルクトグテルトエナブルコマニケーションwhiledensuringsecurity.1.networksarevirtualendpointsnumbered0–655 35、withwell-knownportslike80(http)、443(https)、22(ssh)、および25(smtp)識(shí)別pecificservices.2.portsoperateovertcp(信頼できる、c

Garbage CollectionはJavaでどのように機(jī)能しますか? Garbage CollectionはJavaでどのように機(jī)能しますか? Aug 02, 2025 pm 01:55 PM

JavaのGarbage Collection(GC)は、メモリを自動(dòng)的に管理するメカニズムであり、到達(dá)不可能なオブジェクトを取り戻すことでメモリ漏れのリスクを軽減します。 1.GCルートオブジェクトからのオブジェクトのアクセシビリティ(スタック変數(shù)、アクティブスレッド、靜的フィールドなど)、および到達(dá)不可能なオブジェクトはゴミとしてマークされています。 2。マーククリアリングアルゴリズムに基づいて、すべての到達(dá)可能なオブジェクトをマークし、マークのないオブジェクトをクリアします。 3.世代の収集戦略を採(cǎi)用する:新世代(Eden、S0、S1)は頻繁にMinorGCを?qū)g行します。高齢者のパフォーマンスは少なくなりますが、MajorGCを?qū)g行するのに時(shí)間がかかります。 Metaspaceはクラスメタデータを保存します。 4。JVMはさまざまなGCデバイスを提供します。SerialGCは小さなアプリケーションに適しています。 ParallelGCはスループットを改善します。 CMSが減少します

Javaビルドツールの比較:Maven vs. Gradle Javaビルドツールの比較:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

gradleisthebetterchoiceformostnewprojectoitssuperorfficability、performance、andmoderntoolingsupport.1.gradle’sgroovy/kotlindslismoreconciseandexpressiveethanmaven’sverboseml.2.gradleorformsmavenbenbumebutedwitedwitedwitedspedexは

説明された延期聲明の例で進(jìn)みます 説明された延期聲明の例で進(jìn)みます Aug 02, 2025 am 06:26 AM

Deferは、クリーニングリソースなど、関數(shù)が戻る前に指定された操作を?qū)g行するために使用されます。パラメーターは、延期時(shí)にすぐに評(píng)価され、関數(shù)は最後のファーストアウト(LIFO)の順に実行されます。 1.複數(shù)の債務(wù)は、宣言の逆の順序で実行されます。 2.ファイルの閉鎖などの安全なクリーニングに一般的に使用されます。 3。指定された返品値を変更できます。 4.回復(fù)に適したパニックが発生した場(chǎng)合でも実行されます。 5。リソースの漏れを防ぐために、ループで延期の亂用を避けます。正しい使用により、コードのセキュリティと読みやすさが向上します。

See all articles