java .jar

时间:2016-04-08 06:14:31

标签: java unicode jar emoji

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

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

我跟踪了该链接上描述的所有内容,All在开发环境中运行正常,但是当我为此制作jar时,当我向web上的其他用户发送表情符号时,它显示代码(ðŸ〜¡ ?)。

首先,我认为从文件夹中加载文件的问题是如此使用的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中显示像这样的表情符号

enter image description here

请帮我解决。

非常感谢所有人提前

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

  4. 如果您决定采用这种方式,那么我之前使用的开源字体编辑器就是FontForge:https://fontforge.github.io/en-US/。这很简单:你只需在相应的插槽中设计图像,然后输出字体文件。

答案 1 :(得分:0)

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。这两种解决方案都适用于我。