我有从iPhone导入的csv文件并包含表情符号微笑
使用iPhone文件看起来像
但是,如果我使用从计算机打开csv文件
如何在Java中处理这些字符以获得表情符号微笑?
当我将扩展名更改为.txt
我得到了什么:
如何显示原始(iPhone)表情符号?如果我不能这样做,那么如何才能显示像.txt
文件那样的微笑?
每个csv文件都有不同的表情符号微笑!
答案 0 :(得分:6)
首先要做的事情是什么是"表情符号"?
这是"emoticons" Unicode block中的代码点。您将注意到此块在BMP(基本多语言平面)之外,因为此块的所有代码点都大于U + FFFF。
第二点:你的显示器如何对待它们?
这完全取决于您的显示器功能和后处理。通过"功能",可以理解,您的字体可能或许多没有这样的代码点的字素。通过"后处理",可以理解程序可以不同地处理这些代码点。
在iPhone显示示例中,它识别代码点并将其替换为图像。在文本编辑器示例中,它使用的字体具有这些代码点的字素。
第三点:为什么Excel显示这样的废话,而字体似乎有这些代码点的字形?
这是因为Excel中一个长期存在的错误从未被修复过:它总是假设CSV文件是用windows-1252而不是UTF-8编码的;如果文件中的第一个代码点是byte order mark,它只会将它们视为UTF-8。
好的,考虑到所有这些,问题:
如何在Java中处理这些字符以获得表情符号的微笑?
你不需要做任何特别的事情;只需使用正确的字符集打开文件(即StandardCharsets.UTF_8
,或者,如果您不够运气,不使用Java 7 +,Charset.forName("UTF-8")
);然后将内容显示为文本。
当然,使用的字体需要有表情符号的字形,见上文。
如何显示原始(iPhone)表情符号?
你需要"后期治疗"字符流输入,识别表情符号并替换它们的图像。这里有一个问题:Java中的char
仅为16位,因此需要两个char
来编码笑脸。
因此,这不是一项容易的任务;这是可能的但不容易。幸运的是,从Java 8开始,您可以使用.codePoints()
(提醒:String
实现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);
}
}
如果您使用Java 7或更低版本,呃,它仍然可能但更难......