ASCII 到 HTML 实体在 Java 中转义
Posted
技术标签:
【中文标题】ASCII 到 HTML 实体在 Java 中转义【英文标题】:ASCII to HTML-Entities Escaping in Java 【发布时间】:2011-03-26 06:39:56 【问题描述】:我发现这个网站带有转义码,我只是想知道是否有人已经这样做了,所以我不必花费几个小时来构建这个逻辑:
StringBuffer sb = new StringBuffer();
int n = s.length();
for (int i = 0; i < n; i++)
char c = s.charAt(i);
switch (c)
case '\u25CF': sb.append("●"); break;
case '\u25BA': sb.append("►"); break;
/*
... the rest of the hex chars literals to html entities
*/
default: sb.append(c); break;
【问题讨论】:
看到这个帖子...***.com/questions/994331/… 您想要完全相同的值,还是需要将某些值转换为其他值? 另见:***.com/questions/1273986/… @Mat Banik - 回复:结果;你确定你在编译阶段没有转码错误?见这里:illegalargumentexception.blogspot.com/2009/05/… 【参考方案1】:这些“代码”只是实际字符的 unicode 值的十进制表示。在我看来,这样的事情会起作用,除非您想非常严格地确定哪些代码被转换,哪些不被转换。
StringBuilder sb = new StringBuilder();
int n = s.length();
for (int i = 0; i < n; i++)
char c = s.charAt(i);
if (Character.UnicodeBlock.of(c) != Character.UnicodeBlock.BASIC_LATIN)
sb.append("&#");
sb.append((int)c);
sb.append(';');
else
sb.append(c);
【讨论】:
您也应该注意代理对。 (这意味着迭代代码点,而不是代码单元。) 正如 Paŭlo 所提到的,此代码对于代理对(例如表情符号)是错误的。请参阅my answer 以正确处理它们。【参考方案2】:其他答案不适用于代理对,例如如果您有诸如“?”之类的表情符号(请参阅character info)。以下是在 Java 8 中的操作方法:
StringBuilder sb = new StringBuilder();
s.codePoints().forEach(codePoint ->
if (Character.UnicodeBlock.of(codePoint) != Character.UnicodeBlock.BASIC_LATIN)
sb.append("&#");
sb.append(codePoint);
sb.append(';');
else
sb.appendCodePoint(codePoint);
);
对于较旧的 Java:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); )
int c = s.codePointAt(i);
if (Character.UnicodeBlock.of(c) != Character.UnicodeBlock.BASIC_LATIN)
sb.append("&#");
sb.append(c);
sb.append(';');
else
sb.appendCodePoint(c);
i += Character.charCount(c);
测试解决方案是否正确处理代理对的一种简单方法是使用"\uD83D\uDE00"
(?) 作为输入。如果输出是"&#55357;&#56832;"
,那就错了。正确的输出是&#128512;
。
【讨论】:
【参考方案3】:嗯,如果你改为这样做会怎样:
if (c > 127)
sb.append("&#" + (int) c + ";");
else
sb.append(c);
然后你只需要确定你希望 HTML 转义的字符范围。在这种情况下,我只是指定了 ASCII 表空间之外的任何字符。
【讨论】:
看来 Pawel 有更完整的答案。 255 对于 ASCII 来说太高了 - 它只有 7 位,所以你想要 127。以上是关于ASCII 到 HTML 实体在 Java 中转义的主要内容,如果未能解决你的问题,请参考以下文章
在 WebForm 标签中转义 HTML 实体并避免 HTML 注入?
在没有 Owasp 库的情况下,如何在 Java 中转义 HTML 属性值?