将 Unicode 字符 'POPCORN' 转义为 HTML 实体

Escape Unicode Character 'POPCORN' to HTML Entity

我有一个带有表情符号的字符串

I love 

我需要用它的 html 实体转义那个爆米花表情符号,所以我得到

I love 🍿

我正在 Java 中编写我的代码,我一直在尝试不同的 StringEscapeUtils 库,但还没有让它工作。请帮我弄清楚我可以用什么来转义像爆米花这样的特殊字符。

供参考:

Unicode Character Information

Unicode 8.0 (June 2015)

这有点老套,因为我不相信有现成的库可以做到这一点;假设您不能简单地在 HTML 页面(应该能够按原样呈现)上使用 UTF-8(或 UTF-16),您可以使用 Character.codePointAt(CharSequence, int) and Character.offsetByCodePoints(CharSequence, int, int)1 如果给定字符超出正常的 ASCII 范围则执行转换。像,

String str = "I love ";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
    char ch = str.charAt(i);
    if (ch > 127) {
        sb.append(String.format("&#x%x;", Character.codePointAt(str, i)));
        i += Character.offsetByCodePoints(str, i, 1) - 1;
    } else {
        sb.append(ch);
    }
}
System.out.println(sb);

哪个输出(按要求)

I love &#x1f37f;

1根据 Andreas 的 编辑。

通常 emoji4j library 有效。它有一个简单的 htmlify 方法用于 HTML 编码。

例如:

String text = "I love ";

EmojiUtils.htmlify(text); //returns "I love &#127871"

EmojiUtils.hexHtmlify(text); //returns "I love &#x1f37f"

您可以使用 unbescape 库:unbescape: powerful, fast and easy escape/unescape operations for Java

例子

将依赖项添加到 pom.xml 文件中:

<dependency>
    <groupId>org.unbescape</groupId>
    <artifactId>unbescape</artifactId>
    <version>1.1.6.RELEASE</version>
</dependency>

用法:

import org.unbescape.html.HtmlEscape;
import org.unbescape.html.HtmlEscapeLevel;
import org.unbescape.html.HtmlEscapeType;

<…>

final String inputString = "\uD83C\uDF7F";
final String escapedString = HtmlEscape.escapeHtml(
    inputString,
    HtmlEscapeType.HEXADECIMAL_REFERENCES,
    HtmlEscapeLevel.LEVEL_2_ALL_NON_ASCII_PLUS_MARKUP_SIGNIFICANT
);

// Here `escapedString` has the value: `&#x1f37f;`.

对于您的用例,可能应该使用 HtmlEscapeType.HTML4_NAMED_REFERENCES_DEFAULT_TO_HEXAHtmlEscapeType.HTML5_NAMED_REFERENCES_DEFAULT_TO_HEXA 而不是 HtmlEscapeType.HEXADECIMAL_REFERENCES

我会使用 CharSequence::codePoints 获取代码点的 IntStream 并将它们映射到字符串,然后收集它们,连接成一个字符串:

public String escape(final String s) {
    return s.codePoints()
        .mapToObj(codePoint -> codePoint > 127 ?
            "&#x" + Integer.toHexString(codePoint) + ";" :
             new String(Character.toChars(codePoint)))
    .collect(Collectors.joining());
}

对于指定的输入,这将产生:

I love &#x1f37f;