将ISO8859字符串转换为UTF8?ÄÖÜ=>Ã为什么?

Lis*_*ssy 6 java string unicode character-encoding

这个代码有什么问题?我制作了一个ISO8859字符串.因此,大多数ÄÖÜ都是一些krypooutput.没关系.但是如何将它们转换回普通字符(UTF8或其他东西)?

    String s = new String("Üü?öäABC".getBytes(), "ISO-8859-15");

    System.out.println(s);
    //ÃÃŒ?öÀABC => ok(?)
    System.out.println(new String(s.getBytes(), "ISO-8859-15"));
    //ÃÂÃÅ?öÃâ¬ABC => ok(?)
    System.out.println(new String(s.getBytes(), "UTF-8"));
    //ÃÃŒ?öÀABC => huh?
Run Code Online (Sandbox Code Playgroud)

Joa*_*uer 7

如A构建体new String("Üü?öäABC".getBytes(), "ISO-8859-15");几乎总是一个错误.

你在做什么在这里走的是一条String对象,得到了相应byte[]平台默认的编码,并重新将其解释为ISO-8859-15将其转换回String.

如果平台默认编码恰好是ISO-8859-15(或者足够接近这个特定的String,例如ISO-8859-1),那么它就是无操作(即它没有实际效果).

在所有其他情况下,它很可能会破坏String.

如果你试图"修复"a String,那么你可能为时已晚:如果你必须使用特定的编码来读取数据,那么你应该在二进制数据转换为String数据的时候使用它.例如,如果您从a读取InputStream,则需要将正确的编码传递给.的构造函数InputStreamReader.

试图"事后"解决问题

  1. 更难做到
  2. 通常甚至不可能(因为byte[]使用错误的编码解码a 可能是破坏性操作).


小智 7

我希望这能解决你的问题.

String readable = "äöüÄÖÜßáéíóúÁÉÍÓÚàèìòùÀÈÌÒÙñÑ";

try {
    String unreadable = new String(readable.getBytes("UTF-8"), "ISO-8859-15");
    // unreadable -> äöüÃÃÃÃáéíóúÃÃÃÃÃàèìòùÃÃÃÃÃñÃ
} catch (UnsupportedEncodingException e) {
    // handle error
}
Run Code Online (Sandbox Code Playgroud)

和:

String unreadable = "äöüÃÃÃÃáéíóúÃÃÃÃÃàèìòùÃÃÃÃÃñÃ";

try {
    String readable = new String(unreadable.getBytes("ISO-8859-15"), "UTF-8");
    // readable -> äöüÄÖÜßáéíóúÁÉÍÓÚàèìòùÀÈÌÒÙñÑ
} catch (UnsupportedEncodingException e) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)


McD*_*ell 4

String s = new String("\xc3\x9c\xc3\xbc?\xc3\xb6\xc3\xa4ABC".getBytes(), "ISO-8859-15"); //bug\n
Run Code Online (Sandbox Code Playgroud)\n\n

这段代码所做的只是破坏数据。它将 UTF-16 数据转码为系统编码(无论是什么),并获取这些字节,假装它们是有效的 ISO-8859-15 并将它们转码为 UTF-16。

\n\n
\n

那么如何将“\xc3\x83\xc3\x83\xc5\x92?\xc3\x83\xc2\xb6\xc3\x83\xe2\x82\xacABC”这样的输入字符串转换为正常字符串呢?(如果我知道该字符串来自 ISO8859 文件)。

\n
\n\n

执行此操作的正确方法如下:

\n\n
byte[] iso859_15 = { (byte) 0xc3, (byte) 0xc3, (byte) 0xbc, 0x3f,\n  (byte) 0xc3, (byte) 0xb6, (byte) 0xc3, (byte) 0xa4, 0x41, 0x42,\n         0x43 };\nString utf16 = new String(iso859_15, Charset.forName("ISO-8859-15"));\n
Run Code Online (Sandbox Code Playgroud)\n\n

Java 中的字符串始终为 UTF-16。所有其他编码必须使用byte类型来表示。

\n\n

现在,如果您用来System.out输出结果字符串,则可能无法正确显示,但这是一个不同的转码问题。例如,Windows 控制台默认编码与系统编码不匹配。使用的编码System.out必须与接收数据的设备的编码相匹配。您还应该注意确保您正在使用编辑器所使用的相同编码来读取源文件。

\n\n

要了解不同语言对字符数据的处理有何不同,请阅读此内容

\n