我在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");
。我不知道是谁做到了这一点以及他为什么这么做,但很明显这搞砸了。对于所有看到错误版本代码的人都很抱歉。我不知道是谁编辑的。上面的代码现在是正确的。
答案 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-8和ISO-8859-1使用超出ASCII范围的每个字符的每个不同字节表示。
如果您使用的是UTF-8中的字符,但不是ISO-8859-1中的字符,那么它当然会失败。