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");
正確には何もしません。
デフォルトのエンコーディングとは異なるエンコーディングで文字列を stdout に書き込むには、次のようなエンコーダを作成しnew OutputStreamWriter(System.out, "cp1252")
、文字列の内容をそれに送信します。
ただし、この場合、コンソールは Windows コード ページ 1252 西ヨーロッパ (+1 ATorres) を使用しているようです。ここにはエンコードの不一致の問題はまったくないため、文字列を再エンコードしても解決できません!
デフォルトのエンコーディング cp1252 はコンソールのエンコーディングと一致しますが、cp1252 にはトルコ文字がまったく含まれていないだけですğşĞŞı
。cp1252 にある他の文字がüçÜÇ
正常に表示されることがわかります。必要なすべての文字を含む別のエンコーディングを使用するようにコンソールを再構成できない限り、それらの文字を出力する方法はありません。
おそらくトルコ語の Windows インストールでは、デフォルトのコード ページは代わりに cp1254 になり、期待どおりの文字が得られます (ただし、他の文字は機能しません)。これは、[地域と言語のオプション] コントロール パネル アプリで [非 Unicode アプリケーションに使用する言語] 設定を変更することでテストできます。
残念ながら、デフォルトのコード ページとして UTF-8 を使用する Windows ロケールはありません。stdio ストリーム関数を使用して非 ASCII 出力をコンソールに出力することは、まったく信頼できるものではありません。Unicode をコンソールに直接書き込むための Win32 API がありますが、残念ながらそれをあまり使用していません。