【问题标题】:Emoji unicode issue with java .jarjava .jar 的 Emoji unicode 问题
【发布时间】:2016-07-29 07:32:45
【问题描述】:

我正在用 J2SE 开发聊天应用程序,它还可以发送表情符号给其他用户。

应用程序使用https://github.com/vdurmont/emoji-java(Vdurmont Emoji-java-2.1 jar),

我遵循了该链接上描述的所有内容,在开发环境中一切都运行良好,但是当我为相同的 jar 制作时,当我在网络上向其他用户发送表情符号时,它会显示代码(ðŸ~¡ 和?)。

首先我认为这是从文件夹加载文件的问题,所以使用了 ClassLoader, 为了获得正确的图像,但在创建 jar 时它显示?(问号),所以我删除了该代码以便更好地理解你。

代码如下:

public ChatUI() {

        initComponents();

        this.setLayout(new WrapLayout(FlowLayout.LEFT, 5, 5));

        for (int i = 0; i < imageHexaCode.length; i++)
        {

            final javax.swing.JLabel imogis = new javax.swing.JLabel("&#x" + imageHexaCode[i] + ";");


            imogis.setCursor(new Cursor(Cursor.HAND_CURSOR));

            imogis.setIcon(new javax.swing.ImageIcon(getClass().getResource("emoji_" + imageHexaCode[i] + ".png")));

            imogis.setHorizontalTextPosition(JLabel.CENTER);

            imogis.setVerticalTextPosition(JLabel.BOTTOM);

            imogis.setFont(new Font(null, Font.PLAIN, 1));

            imogis.setForeground(Color.white);

            final int aa = i;

            imogis.addMouseListener(new MouseAdapter() {

                @Override
                public void mousePressed(MouseEvent e) {

                    JLabel jl = new JLabel("&#x" + imageHexaCode[aa] + ";");

                    jl.setName("&#x" + imageHexaCode[aa] + ";");

                    jl.setFont(new Font(null, Font.PLAIN, 1));

                    jl.setHorizontalTextPosition(JLabel.CENTER);

                    jl.setVerticalTextPosition(JLabel.BOTTOM);

                    jl.setIcon(new javax.swing.ImageIcon(getClass().getResource("emoji_" + imageHexaCode[aa] + ".png")));

                    jl.setForeground(Color.white);

                    ChatPaneWrite.jtp.insertComponent(jl);

                    System.out.println("" + imogis.getText());

                    // you can open a new frame here as
                    // i have assumed you have declared "frame" as instance variable

                }

            });

            this.add(imogis);

        }

        this.revalidate();

        this.repaint();

    }

其中 imageHexaCode 是表情符号字符串数组。

    static String[] imageHexaCode = {
            "1f621",
            "1f608",
            "2764",
            "1f494"
};

& jtp 是 JTextPane,当用户点击标签时插入表情符号组件

ChatPaneWrite.jtp.insertComponent(jl);

表情符号存储在我正在编写的同一个包中,这就是我没有直接使用 ClassLoader 的原因

jl.setIcon(new javax.swing.ImageIcon(getClass().getResource("emoji_" + imageHexaCode[aa] + ".png")));

也可以写成ChatUI包

jl.setIcon(new javax.swing.ImageIcon(getClass().ClassLoader.getResource("ChatUI/emoji_" + imageHexaCode[aa] + ".png")));

这里是快照:

在接收端的 jar 中显示这样的表情

请帮我解决。

提前非常感谢大家

【问题讨论】:

  • 您是否也在导出 JAR 中的图像?
  • @abdulrahmank 是的,图像可以正确导出并显示在用户界面上,只有发送和接收有问题。
  • 尚未进入您的代码,但从 UI 上显示的内容来看,它对我来说看起来很垃圾,可能是由不正确的字符编码引起的。 (例如,发件人正在发送 UTF-16 字符,而您将它们解释为扩展的 ASCII)。如果是这种情况,它也可以解释为什么您未能查找表情符号
  • @AdrianShum:如果我按照你说的做,那为什么表情符号在开发环境中可以正常工作?
  • 可能,它与 NetBeans IDE 当前运行时项目工作正常但是在@DheerajUpadhyay 使用所有必要的 lib 构建/制作 .jar 文件后,会出现 Emoji unicode 解析问题

标签: java unicode jar emoji


【解决方案1】:

emoji-java 使用 UTF-8 编码进行解析,默认情况下 Netbeans 也使用相同的编码,这就是为什么在 Netbeans 中运行时解析正常的原因。

但是当你将程序作为 jar 文件运行时,编码方案将基于你的系统环境。

作为一种快速解决方案,您可以强制使用 UTF-8 编码来运行您的 jar 文件。

java -Dfile.encoding=UTF-8 -jar your-jar-file.jar

或者如果你想要一个程序化的解决方案,可以使用这个代码

System.setProperty("file.encoding", "UTF-8");
java.lang.reflect.Field charset = null;
charset = java.nio.charset.Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null, null);

它是 vdurmont 的 emoji-java 中的一般 issue。这两种解决方案都适合我。

【讨论】:

  • 您好,Krish,我认为这可能可行,但我在 4 年前使用 System.setProperty("file.encoding", "UTF-8"); 解决了这个问题。感谢您的回答。
【解决方案2】:

第一步是检查图像资源在运行时是否确实存在。例如,添加一些记录 getClass().getResource("emoji_" + imageHexaCode[aa] + ".png") 的值以确保它不是 null。在您的开发环境中,这些可能是可用的,但由于您构建生产版本的方式,它们会以某种方式被遗漏或放在错误的目录中。

但是,如果您不介意,我还想建议一种替代方法:您是否考虑过将表情符号构建到字体中,然后将字体文件与您的应用程序一起提供,而不是使用标签和图像图标?这将有几个显着的优势:

  1. 您不需要对表情符号进行任何特殊处理:只需将 unicode 文本放入使用您的自定义字体的组件中,表情符号以及所有其他文本都可以正常工作。

  2. 字体图像可以是矢量图像,这意味着它们可以随着用户更改字体大小/缩放级别等而很好地缩放。

  3. 用户可以剪切/复制/粘贴包含表情符号的文本;因为它是文本,所以它会再次“正常工作”。

如果你决定走这条路,有一个我以前用过的优秀的开源字体编辑器,叫做 FontForge:https://fontforge.github.io/en-US/。这很简单:您只需在适当的字符代码槽中设计图像,然后导出字体文件。

【讨论】:

  • 先生,我也按照您的建议做了,但问题仍然没有解决。
  • 先生,我提取 jar 文件以查看生产存储图像的位置,首先我知道这可能是因为我将这些表情符号放在我的类文件所在的同一文件夹中,其次,我也做了您提出的建议,但问题仍未解决。
猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 2014-08-30
  • 2021-08-16
  • 2016-12-23
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2011-11-13
相关资源
最近更新 更多