ASCII到HTML实体在Java中转义

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

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

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

其他答案对代理对不起作用,例如,如果你有Emojis,如“😀”(见字符信息 )。 以下是如何在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" (😀)作为输入。 如果输出是"��" 那是错的。 正确的输出是😀

嗯,如果你做了这样的事情,那该怎么办呢:

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

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