我一直在使用 i18n 的东西,并且认为我对此了解很多。但我正在测试一些东西,我越看它,它变得越糟。
我们从一个字符串开始:Boğaziçi Üniversitesi
它由我们的富客户端应用程序(运行 Windows 并使用 windows-1254)发送给我们,解释为 ISO-8859-1(不要问)并保存在 MySQL 数据库中。现在,在数据库中,我看到下面的字符值,可以这样解释为 windows-1254:
42 6f f0 61 7a 69 e7 69 20 dc 6e 69 76 65 72 73 69 74 65 73 69
B o ğ a z i ç i Ü n i v e r s i t e s i
到目前为止,一切都很好。这看起来是字符串的正确形式。
但是,这是通过在字符串上运行 getBytes() 得到的,没有或不同的编码:
BU.getBytes(): (21) 42 6f 3f 61 7a 69 8d 69 20 86 6e 69 76 65 72 73 69 74 65 73 69
BU.getBytes(windows-1254): (21) 42 6f 3f 61 7a 69 e7 69 20 dc 6e 69 76 65 72 73 69 74 65 73 69
BU.getBytes(ISO-8859-1):(21)42 6f f0 61 7a 69 e7 69 20 dc 6e 69 76 65 72 73 69 74 65 73 69
BU.getBytes(UTF8):(24)42 6f c3 b0 61 7a 69 c3 a7 69 20 c3 9c 6e 69 76 65 72 73 69 74 65 73 69
所以,看着最后一个,人们不得不想知道“ð”是从哪里来的。
42 6f c3 b0 61 7a 69 c3 a7 69 20 c3 9c 6e 69 76 65 72 73 69 74 65 73 69
B o ð a z i ç i Ü n i v e r s i t e s i
从http://rishida.net/tools/conversion/,这是我期望获得的有效 UTF-8 字符串中的值:
42 6f C4 9F 61 7a 69 C3 A7 69 20 C3 9C 6e 69 76 65 72 73 69 74 65 73 69
B o ğ a z i ç i Ü n i v e r s i t e s i
在此处删除问题的最后一部分并替换为。
这段代码:
byte BU_Array[] = new byte[] { (byte)0x42, (byte)0x6F, (byte)0xF0, (byte)0x61,
(byte)0x7A, (byte)0x69,(byte)0xE7, (byte)0x69, (byte)0x20, (byte)0xDC,
(byte)0x6E, (byte)0x69, (byte)0x76, (byte)0x65, (byte)0x72, (byte)0x73,
(byte)0x69, (byte)0x74, (byte)0x65, (byte)0x73, (byte)0x69 };
try {
String BU_Str_ISO88591 = new String(BU_Array, "ISO-8859-1");
System.out.println("BU_Str_ISO88591 cP: "+codePointsToHex(BU_Str_ISO88591));
String BU_Str_W1254 = new String(BU_Array, "windows-1254");
System.out.println("BU_Str_W1254 cP: "+codePointsToHex(BU_Str_W1254));
byte bytes_possibly_as_utf8[] = BU_Str_W1254.getBytes("UTF-8");
System.out.println("bytes from BU_Str_W1254: "+Utilities.bytesToHex(bytes_possibly_as_utf8));
} catch (java.io.UnsupportedEncodingException uee) {
uee.printStackTrace();
}
产生:
BU_Str_ISO88591 cP: (21): 42 6f f0 61 7a 69 e7 69 20 dc 6e 69 76 65 72 73 69 74 65 73 69
BU_Str_W1254 cP: (21): 42 6f 11f 61 7a 69 e7 69 20 dc 6e 69 76 65 72 73 69 74 65 73 69
bytes from BU_Str_W1254: (24) 42 6f c4 9f 61 7a 69 c3 a7 69 20 c3 9c 6e 69 76 65 72 73 69 74 65 73 69
这里令人困惑的是第一行中的第三个字符。
当我将一个字符串作为 windows-1254 提供给我们,但我们将其解释为 iso-8859-1 时,第三个字符的代码点是 f0。哪个是 windows-1254 中的正确字符。嗯?那只是巧合吗?我对此表示怀疑,但逻辑似乎很复杂。
所以,我想我在这里回答了我自己的问题。