2

我一直在使用 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 中的正确字符。嗯?那只是巧合吗?我对此表示怀疑,但逻辑似乎很复杂。

所以,我想我在这里回答了我自己的问题。

4

0 回答 0