我不确定标准库中是否有将执行此操作的规范化例程。我不认为标准的Unipre规范化程序会处理“智能”引号的转换-
但不要引用我。
明智的做法是转储ISO-8859-1并开始使用
UTF-8。也就是说,可以将任何通常允许的Unipre代码点编码为HTML网页,编码为
ISO-8859-1。您可以使用转义序列对它们进行编码,如下所示:
public final class HtmlEnprer { private HtmlEnprer() {} 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.UnipreBlock.of(ch) == Character.UnipreBlock.BASIC_LATIN) { out.append(ch); } else { int prepoint = Character.prePointAt(sequence, i); // handle supplementary range chars i += Character.charCount(prepoint) - 1; // emit entity out.append("&#x"); out.append(Integer.toHexString(prepoint)); out.append(";"); } } return out; }}用法示例:
String foo = "This is Cyrillic Ya: u044Fn" + "This is fraktur G: uD835uDD0An" + "This is a smart quote: u201C";StringBuilder sb = HtmlEnprer.escapeNonLatin(foo, new StringBuilder());System.out.println(sb.toString());
上面的字符左双引号(
U+201C“ )被编码为&#x201C;。同样,对其他两个任意代码点也进行了编码。
需要谨慎使用此方法。如果您的文本需要针对HTML进行转义,则需要在上述代码或“与”号最终转义之前完成。



