将 Unicode 字符 'POPCORN' 转义为 HTML 实体
Escape Unicode Character 'POPCORN' to HTML Entity
我有一个带有表情符号的字符串
I love
我需要用它的 html 实体转义那个爆米花表情符号,所以我得到
I love 🍿
我正在 Java 中编写我的代码,我一直在尝试不同的 StringEscapeUtils 库,但还没有让它工作。请帮我弄清楚我可以用什么来转义像爆米花这样的特殊字符。
供参考:
这有点老套,因为我不相信有现成的库可以做到这一点;假设您不能简单地在 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 🍿
1根据 Andreas 的 编辑。
通常 emoji4j library 有效。它有一个简单的 htmlify
方法用于 HTML 编码。
例如:
String text = "I love ";
EmojiUtils.htmlify(text); //returns "I love 🍿"
EmojiUtils.hexHtmlify(text); //returns "I love 🍿"
您可以使用 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: `🍿`.
对于您的用例,可能应该使用 HtmlEscapeType.HTML4_NAMED_REFERENCES_DEFAULT_TO_HEXA
或 HtmlEscapeType.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 🍿
我有一个带有表情符号的字符串
I love
我需要用它的 html 实体转义那个爆米花表情符号,所以我得到
I love 🍿
我正在 Java 中编写我的代码,我一直在尝试不同的 StringEscapeUtils 库,但还没有让它工作。请帮我弄清楚我可以用什么来转义像爆米花这样的特殊字符。
供参考:
这有点老套,因为我不相信有现成的库可以做到这一点;假设您不能简单地在 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 🍿
1根据 Andreas 的
通常 emoji4j library 有效。它有一个简单的 htmlify
方法用于 HTML 编码。
例如:
String text = "I love ";
EmojiUtils.htmlify(text); //returns "I love 🍿"
EmojiUtils.hexHtmlify(text); //returns "I love 🍿"
您可以使用 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: `🍿`.
对于您的用例,可能应该使用 HtmlEscapeType.HTML4_NAMED_REFERENCES_DEFAULT_TO_HEXA
或 HtmlEscapeType.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 🍿