Javaの:トルコエンコーディングマック/ Windowsの
質問
私は別のマシン上のトルコ語の特殊文字に問題があります。次のコード:
String turkish = "ğüşçĞÜŞÇı";
String test1 = new String(turkish.getBytes());
String test2 = new String(turkish.getBytes("UTF-8"));
String test3 = new String(turkish.getBytes("UTF-8"), "UTF-8");
System.out.println(test1);
System.out.println(test2);
System.out.println(test3);
Macでは3つの文字列は元の文字列と同じです。
:Windowsマシン上の3行は(Netbeansの6.7コンソールで印刷されます)?ü?ç?Ü?Ç?
ğüşçĞÜŞÇı
?ü?ç?Ü?Ç?
私はこの問題を得ることはありません。
解決
String test1 = new String(turkish.getBytes());
あなたは(デフォルトのエンコーディングを使用すると、通常は間違いです)トルコ語文字を含むUnicode文字列を取り、デフォルトのエンコーディングを使用してバイトにそれを回すいます。あなたは、再びデフォルトのエンコーディングを使用して、その後、それらのバイトを取り、バックの文字列にそれらをデコードしています。結果は、あなたが(デフォルトのエンコーディングに収まらない任意の文字を失うことを除いて)何も達成していないてきたです。あなたがエンコード/デコードサイクルを通じて文字列を入れているかどうかを持っているのそれはまだ文字列ではなくバイトを印刷しているため、次のSystem.out.println(test1)
が何をするかに影響を与えずの
String test2 = new String(turkish.getBytes("UTF-8"));
は、UTF-8でエンコードし、既定のエンコーディングを使用して復号化します。 Macではデフォルトエンコーディングはので、これは何もしませんUTF-8です。 Windowsでは、デフォルトのエンコードので、結果が間違った文字であるUTF-8になることはありません。
String test3 = new String(turkish.getBytes("UTF-8"), "UTF-8");
正確に何もしません。
デフォルトのエンコーディングと異なるエンコーディングを標準出力に文字列を作成するには、new OutputStreamWriter(System.out, "cp1252")
のようなエンコーダのものを作成し、それに文字列のコンテンツを送信思います。
ただし、この場合には、それが見えます。そこにはエンコーディングのミスマッチの問題は全くここにありませんので、あなたは再エンコード文字列でそれを解決することはできません!
デフォルトのエンコーディングのCP1252は、コンソールのエンコーディングに一致し、それはCP1252はトルコの文字がまったくğşĞŞı
含まれていないだけということです。あなただけの罰金を通ってくる、CP1252、üçÜÇ
に を他の文字をしている見ることができます。あなたが欲しいすべての文字が含まれない別のエンコーディングを使用するには、コンソールを再設定することができない限り、あなたはそれらの文字を出力することができます方法はありません。
おそらく、デフォルトコードページが代わりにcp1254され、あなたが期待する文字(しかし、他の文字が動作しない)を取得します。あなたは、地域と言語のオプションコントロールパネルアプリの設定 '非Unicodeアプリケーションで使用する言語の変化することによってこれをテストすることができます。
残念ながら、Windowsのロケールは、既定のコードページとしてUTF-8を使用していません。標準入出力ストリーム関数を使用してコンソール上に非ASCII出力を置くことは、まったく本当に信頼できるのですものではありません。そこコンソールに直接Unicodeを書くためのWin32 APIはあるが、残念ながらあまり何もそれを使用していません。
他のヒント
コンソール上、またはデフォルトプラットフォームのエンコーディングに依存しないでください。常にgetBytes
とバイト配列を取るStringコンストラクタなどの呼び出しのための文字エンコーディングを指定し、文字列の内容を確認したい場合は、各文字のUnicode値を印刷します。
私はまた、あなたがコンパイル時にのいずれかの(非ASCII文字をエンコードすると\ uXXXXという)ASCIIを使用するようにソースコードを制限するまたはのは、明示的に文字エンコーディングを指定する助言します。
さて、大きな何か問題あなたが解決しようとしている?
あなたはデフォルトのエンコーディングの異なる設定に対処することができる。
java -Dfile.encoding=utf-8
対
java -Dfile.encoding=something else
それとも、あなただけのMacのターミナルウィンドウがUTF-8で動作し、WindowsのDOSボックスは、UTF-8でのないの仕事をしているという事実を見ても良い。
氏スキートあたりとして、あなたはあなたがあなたの元にUTF-8文字を埋め込むしようとしているということである、第3の可能な問題を抱えています。コンパイラオプションに応じて、またはあなたがそこに意図し何を取得してもしなくてもよいです。 uはエスケープ\プロパティファイルにこのデータを入れて、または使用します。
最後に、また、氏はスキートあたりに、決して、今まで)(ゼロ引数GetBytesメソッドを呼び出します。
あなたはそれがあまりにもUTF-8にエンコードだ設定することを忘れないでくださいAspectJのコンパイラを使用している場合。私は時間のためにこれを見つけるのに苦労しています。