第一件事:什么是"表情符号"?
它是"表情符号"Unicode块中的代码点.您将注意到此块在BMP(基本多语言平面)之外,因为此块的所有代码点都大于U + FFFF.
第二点:你的显示器如何对待它们?
这完全取决于您的显示器的功能和后处理.通过"功能",可以理解您的字体可能或许多没有这样的代码点的字素.通过"后处理",可以理解,程序可以不同地处理这样的代码点.
在iPhone显示示例中,它识别代码点并将其替换为图像.在文本编辑器示例中,它使用的字体具有这些代码点的字素.
第三点:为什么Excel显示这样的废话,而字体似乎有这些代码点的字形?
这是因为Excel中一个长期存在的错误从未被修复过:它总是假设CSV文件是用windows-1252而不是UTF-8编码的; 如果文件中的第一个代码点是字节顺序标记,它只会将它们视为UTF-8 .
好的,考虑到所有这些,问题:
如何在Java中处理这些字符以获得表情符号微笑?
你不需要做任何特别的事情; 只需使用正确的字符集打开文件(StandardCharsets.UTF_8
如果你不幸使用Java 7+,那将是或者Charset.forName("UTF-8")
;); 然后将内容显示为文本.
当然,使用的字体需要有表情符号的字形,见上文.
我该如何显示原始(iPhone)表情符号?
您将需要"后处理"字符流输入,识别表情符号并替换它们的图像.这里有一个问题:char
Java中只有16位,因此char
编写笑脸需要两个s.
因此,这不是一项容易的任务; 这是可能的但不容易.幸运的是,从Java 8开始,您可以使用.codePoints()
(提醒:String
implements CharSequence
),它会将一个IntStream
代码点返回到字符串中; 示例代码:
public final class Foo {
// Same signature as an IntComsumer...
private static void handleCodePoint(final int codePoint)
{
if (Character.UnicodeBlock.of(codePoint).equals(Character.UnicodeBlock.EMOTICONS)) {
// treat as an emoticon
} else {
// treat as non emoticon
}
}
// ...
public void doDisplay(final String input)
{
// ... therefore usable in an IntStream's .forEach()
input.codePoints().forEach(Foo::handleCodePoint);
}
}
Run Code Online (Sandbox Code Playgroud)
如果你使用Java 7或更少,呃,它仍然可能但更难...