UTF-8和ISO 8859-1之间的转换:

时间:2012-02-17 15:18:52

标签: java encoding utf-8 iso-8859-1

我在SO中找到了以下code 。这真的有效吗?

String xml = new String("áéíóúñ");
byte[] latin1 = xml.getBytes("UTF-8");
byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8");

我的意思是,latin1在第二行是UTF-8编码,但在第三行中读取ISO-8859-1编码?这可以用吗?

并非我不想批评引用的代码,我只是感到困惑,因为我遇到了一些非常相似的遗留代码,这似乎有用,我无法解释原因。

编辑:我猜在原版post中,第2行的“UTF-8”只是一个TYPO。但我不确定......

EDIT2:我的首次发帖后,有人编辑了上面的代码并将第2行更改为byte[] latin1 = xml.getBytes("ISO-8859-1");。我不知道是谁做到了这一点以及他为什么这么做,但很明显这搞砸了。对于所有看到错误版本代码的人都很抱歉。我不知道是谁编辑的。上面的代码现在是正确的。

2 个答案:

答案 0 :(得分:4)

getBytes(Charset charset)导致使用charset编码的字节数组,因此latin1采用UTF-8编码。

System.out.println(latin1.length);作为第三行,它会告诉您字节数组长度为12.这意味着它实际上是UTF-8编码。

new String(latin1, "ISO-8859-1")不正确,因为latin1是UTF-8编码的,你要告诉它将其解析为ISO-8859-1。这就是为什么它产生一个由12个垃圾符号组成的字符串:áéíóúñ

当您使用UTF-8编码从áéíóúñ获取字节时,会产生24个长字节数组。

我希望现在一切都很清楚。

答案 1 :(得分:0)

这两个字符编码中都存在这些字符。只是UTF-8ISO-8859-1使用超出ASCII范围的每个字符的每个不同字节表示。

如果您使用的是UTF-8中的字符,但不是ISO-8859-1中的字符,那么它当然会失败。