編集:私はこの質問がやや無意味であると確信しています。回答してくださった方々に感謝します。より具体的なフォローアップの質問を投稿する場合があります。
今日、私はいくつかのエンコーディングの問題に投資し、基本的な再現ケースを分離するためにこの単体テストを作成しました。
int badCount = 0;
for (int i = 1; i < 255; i++) {
String str = "Hi " + new String(new char[] { (char) i });
String toLatin1 = new String(str.getBytes("UTF-8"), "latin1");
assertEquals(str, new String(toLatin1.getBytes("latin1"), "UTF-8"));
String toWin1252 = new String(str.getBytes("UTF-8"), "Windows-1252");
String fromWin1252 = new String(toWin1252.getBytes("Windows-1252"), "UTF-8");
if (!str.equals(fromWin1252)) {
System.out.println("Can't encode: " + i + " - " + str +
" - encodes as: " + fromWin1252);
badCount++;
}
}
System.out.println("Bad count: " + badCount);
出力:
エンコードできません:129-こんにちは?-次のようにエンコードします:こんにちは?? エンコードできません:141-こんにちは?-次のようにエンコードします:こんにちは?? エンコードできません:143-こんにちは?-次のようにエンコードします:こんにちは?? エンコードできません:144-こんにちは?-次のようにエンコードします:こんにちは?? エンコードできません:157-こんにちは?-次のようにエンコードします:こんにちは?? エンコードできません:193-こんにちはÁ-次のようにエンコードします:こんにちは?? エンコードできません:205-こんにちはÍ-次のようにエンコードします:こんにちは?? エンコードできません:207-こんにちはÏ-次のようにエンコードします:こんにちは?? エンコードできません:208-こんにちは?-次のようにエンコードします:こんにちは?? エンコードできません:221-こんにちは?-次のようにエンコードします:こんにちは?? 悪いカウント:10
MacOS10.6.2上のJDK1.6.0_07
私の観察:
Latin1は、254文字すべてを対称的にエンコードします。Windows-1252はそうではありません。印刷可能な3文字(193、205、207)は、Latin1とWindows-1252で同じコードであるため、問題は発生しないと思います。
誰かがこの振る舞いを説明できますか?これはJDKのバグですか?
-ジェームズ