【问题标题】:ASCII to HTML-Entities Escaping in JavaASCII 到 HTML 实体在 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;
     }
 }

【问题讨论】:

标签: java escaping ascii html-entities


【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多