在Java中将UTF-8转换为ISO-8859-1

我正在阅读XML文档(UTF-8),并最终使用ISO-8859-1在网页上显示内容。正如预期的那样,有几个字符显示不正确,比如(他们显示为?)。

是否可以将这些字符从UTF-8转换为ISO-8859-1?

这是我编写的尝试此功能的代码段:

BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));

StringBuilder sb = new StringBuilder();

String line = null;

while ((line = br.readLine()) != null) {

sb.append(line);

}

br.close();

byte[] latin1 = sb.toString().getBytes("ISO-8859-1");

return new String(latin1);

我不太确定发生了什么问题,但是我认为是re​​adLine()引起了麻烦(因为字符串将是Java /

UTF-16编码的?)。我尝试的另一种变化是将latin1替换为

byte[] latin1 = new String(sb.toString().getBytes("UTF-8")).getBytes("ISO-8859-1");

我已经阅读了有关该主题的先前文章,并且正在学习中。在此先感谢您的帮助。

回答:

我不确定标准库中是否有将执行此操作的规范化例程。我不认为标准的Unicode规范化程序会处理“智能”引号的转换-

但不要引用我。

明智的做法是转储ISO-8859-1并开始使用UTF-8。也就是说,可以将任何通常允许的Unicode代码点编码为HTML网页,编码为ISO-8859-1。您可以使用转义序列对它们进行编码,如下所示:

public final class HtmlEncoder {

private HtmlEncoder() {}

public static <T extends Appendable> T escapeNonLatin(CharSequence sequence,

T out) throws java.io.IOException {

for (int i = 0; i < sequence.length(); i++) {

char ch = sequence.charAt(i);

if (Character.UnicodeBlock.of(ch) == Character.UnicodeBlock.BASIC_LATIN) {

out.append(ch);

} else {

int codepoint = Character.codePointAt(sequence, i);

// handle supplementary range chars

i += Character.charCount(codepoint) - 1;

// emit entity

out.append("&#x");

out.append(Integer.toHexString(codepoint));

out.append(";");

}

}

return out;

}

}

用法示例:

String foo = "This is Cyrillic Ya: \u044F\n"

+ "This is fraktur G: \uD835\uDD0A\n" + "This is a smart quote: \u201C";

StringBuilder sb = HtmlEncoder.escapeNonLatin(foo, new StringBuilder());

System.out.println(sb.toString());

上面的字符左双引号(U+201C )被编码为&#x201C;。同样,对其他两个任意代码点也进行了编码。

需要谨慎使用此方法。如果您的文本需要针对HTML进行转义,则需要在上述代码或“与”号最终转义之前完成。

以上是 在Java中将UTF-8转换为ISO-8859-1 的全部内容, 来源链接: utcz.com/qa/426897.html

回到顶部