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("&#9679;"); break;
         case '\u25BA': sb.append("&#9658;"); 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" (?) 作为输入。如果输出是"&amp;#55357;&amp;#56832;",那就错了。正确的输出是&amp;#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 属性值?

如何在 XML 中转义 & 符号,以便将它们呈现为 HTML 中的实体?

x 在 Java 中转义?

如何在 maven pom 属性值中转义“&”[重复]

在 Clojure/Compojure 中转义/清理用户输入