原因:
エンコードとデコードに一貫性がないため、文字化けが発生します。
まず、java.nio.charset.Charset.defaultCharset()
を呼び出して、システムのデフォルトの文字セットを取得できます。中国の Windows システムはすべて GBK です。そのため、JVM のデフォルトは GBK 文字セットがエンコードとデコードに使用されます。
関連ビデオ学習チュートリアル: java 教育ビデオ
コード化けの最大の可能性は、エンコードとデコードの不一致です。
// 代码片段1: byte[] read = "你好abc".getBytes(); String result = new String(read); System.out.println(result);
このコードに異議を申し立てるには 3 つの手順があります:
1. コーディング。これは簡潔に見せるために書いたものですが、実際には、ファイル/ネットワークなど他のメディアから読み込む場合と同じで、元の入力ストリームがどのようなエンコードで、読み込んだ後のエンコードがどのようなものであるかということになります。ここではエンコード方式を指定しないため、デフォルトは GBK です。
2. デコード。最終的な操作はすべて文字列オブジェクトですが、文字列のバイト配列のデコード方法を指定することで、最終的に文字列オブジェクトを取得できます。デコード方式はここでは指定しないため、デフォルトは GBK です。
3. 文字列を出力して使用します。実際、ここには別のエンコードとデコードのプロセスがあります。つまり、出力ストリームが GBK にエンコードされ、コンソールが GBK にデコードされて、最終的に表示されます。文字列の出力時や利用時にはシステムデフォルトの文字セットが使用されるため、エンコード・デコード時に不整合が生じる可能性がなく、文字化けの原因となりません。
入力ストリームのエンコーディングを変更するとします:
// 代码片段2: byte[] read = "你好abc".getBytes("utf-8"); String result = new String(read); System.out.println(result);
3 つのステップを分析しましょう:
1. エンコーディング、utf-8;
2 、デコード、gbk。
エンコードとデコードが一致しないため、文字化けが発生します。
それを修正する方法については、すでに明らかであると思います。
修復方法は次のとおりです。
// 代码片段3: byte[] read = "你好abc".getBytes("utf-8"); String result = new String(read,"utf-8"); System.out.println(result);
デコード方法をエンコードに対応するように変更するだけです。
概要:
1. 一般に、入力ストリームのエンコードを制御することは難しいため、デコードする際は入力ストリームのエンコード タイプに注意してください。 。通常、入力ストリームの関連メソッドを呼び出すときに、デコード メソッドを参照する charset パラメータが表示されます。
2. 出力ストリームでもエンコード方法を操作できますので、出力結果をその後ファイルなどの入力ストリームで操作しても、デフォルトの方法であれば文字化けは発生しません生成される。通常、出力ストリームの関連メソッドを呼び出すときに charset パラメータが表示されます。これはエンコード メソッドを参照します。
おすすめの関連記事とチュートリアル: Java 入門チュートリアル
以上がJavaで文字化けが発生するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。