小编典典
我不确定标准库中是否有将执行此操作的规范化例程。我不认为标准的Unicode规范化程序会处理“智能”引号的转换-
但不要引用我。
明智的做法是转储ISO-8859-1并开始使用UTF-8。也就是说,可以将任何通常允许的Unicode代码点编码为HTML网页,编码为ISO-8859-1。您可以使用转义序列对它们进行编码,如下所示:
public final class HtmlEncoder {
private HtmlEncoder() {}
public static 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("");
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进行转义,则需要在上述代码或“与”号最终转义之前完成。
2020-10-07