用Java显示表情符号(jFrame)

abd*_*jmi -2 java csv iphone jframe emoji

我有一个从iPhone导入的csv文件,包括表情符号微笑

使用iPhone文件看起来像

在此输入图像描述

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

在此输入图像描述

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

当我将扩展名更改为 .txt

我得到的是:

在此输入图像描述

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

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

fge*_*fge 6

第一件事:什么是"表情符号"?

它是"表情符号"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)表情符号?

您将需要"后处理"字符流输入,识别表情符号并替换它们的图像.这里有一个问题:charJava中只有16位,因此char编写笑脸需要两个s.

因此,这不是一项容易的任务; 这是可能的但不容易.幸运的是,从Java 8开始,您可以使用.codePoints()(提醒:Stringimplements 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或更少,呃,它仍然可能但更难...