在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);
我不太确定发生了什么问题,但是我认为是readLine()引起了麻烦(因为字符串将是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