用Java显示表情符号(jFrame)

时间:2014-11-16 12:47:22

标签: java iphone csv jframe emoji

我有从iPhone导入的csv文件并包含表情符号微笑

使用iPhone文件看起来像

enter image description here

但是,如果我使用从计算机打开csv文件

enter image description here

如何在Java中处理这些字符以获得表情符号微笑?

当我将扩展名更改为.txt

我得到了什么:

enter image description here

如何显示原始(iPhone)表情符号?如果我不能这样做,那么如何才能显示像.txt文件那样的微笑?

每个csv文件都有不同的表情符号微笑!

1 个答案:

答案 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或更低版​​本,呃,它仍然可能但更难......