ASCII到HTML实体在Java中转义

时间:2011-03-26 06:39:57

标签: java escaping ascii html-entities

我发现这个网站有转义码,我只是想知道是否有人已经这样做了所以我不需要花费几个小时来构建这个逻辑:

 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;
     }
 }

3 个答案:

答案 0 :(得分:2)

这些“代码”仅仅是实际角色的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);
     }

 }

答案 1 :(得分:1)

其他答案对代理对不起作用,例如:如果你有Emojis,如“”(见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;

答案 2 :(得分:0)

嗯,如果你做了类似的事情会怎么样:

if (c > 127) {
    sb.append("&#" + (int) c + ";");
} else {
    sb.append(c);
}

然后,您只需确定要转义HTML的字符范围。在这种情况下,我只指定了ASCII表空间之外的任何字符。