为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Java JTextArea 中读取 FNC1 字符

如何在 Java JTextArea 中读取 FNC1 字符

哈士奇WWW 2022-01-12 15:59:20
我有一个可以读取 GS1-DataMatrix 码的手持式扫描仪(就像超市里的那种)。我可以在 Notepad++ 中扫描代码,我可以看到 FNC1 字符被传输(2210 之前的GS,HEX 中的 1D - 第一张图像)现在我正在尝试从 Java 读取相同的 GS1 代码,但无法正常工作,Java 看不到 FNC1。在 Java 中,我只看到“01095011010209171719050810ABCD12342110”。我将字符串转换为十六进制,但结果是一样的,FNC1 也不在十六进制中(第二张图片)。这是测试代码:package gs1.datamatrix;import java.awt.Font;import java.io.UnsupportedEncodingException;import java.math.BigInteger;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JTextArea;import javax.swing.event.DocumentEvent;import javax.swing.event.DocumentListener;import javax.swing.text.BadLocationException;import javax.swing.text.Document;public class GS1DataMatrix {    public static void main(String[] args) {        JFrame f=new JFrame();//creating instance of JFrame          Font font = new Font("Courier New", Font.PLAIN, 16);        JTextArea jtf2 = new JTextArea(); // used to hold the HEX data        jtf2.setBounds(10,250,900, 200);        jtf2.setFont( font.deriveFont( 24.0f) );        jtf2.setLineWrap(true);        f.add(jtf2);//adding button in JFrame          JTextArea jtf1 = new JTextArea(); // scan area for the DataMatrix scanner        jtf1.setBounds(10,10,900, 200);        jtf1.setFont( font.deriveFont( 24.0f) );        jtf1.getDocument().addDocumentListener(new DocumentListener() {            @Override            public void insertUpdate(DocumentEvent e) {                update(e);            }            @Override            public void removeUpdate(DocumentEvent e) {                update(e);            }第一张图片:这是 Notepad++ 读取 FNC1(黑色背景上的GS特殊字符)的方式:第二张图片:这是 Java 结果: 第三张图片:Notepad++ 十六进制转储在每次扫描时将 FNC1 显示为十六进制中的一维:后来编辑 我认为我的原始帖子引起了混淆:我不解析图像,扫描仪内置了为我执行此操作的硬件,我只收到文本和一些特殊字符(FNC1)。
查看完整描述

1 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

阅读后的一些猜测:


FNC1 没有标准表示。 这个 stackoverflow 答案表明,没有办法在用于传输的默认 Latin-1 编码中直接对 FNC1 进行编码。作为一种解决方法,大多数读者似乎默认使用 ASCII 控制字符“组分隔符”(GS、29、0x1d)。


您正在使用摆动控件来显示和处理数据。Swing 主要用于显示目的,而不是用于正确的数据处理目的。

我假设发生的情况是当它在 JTextArea 的内容中设置时,swing 会剥离不可打印的 GS 字符


考虑到您对扫描仪传输数据的确切方式并不十分明确,但您提到“它更像是键盘”,我假设扫描仪通过假装是键盘来传输数据。您将选择输入,按下扫描仪上的按钮,它将以按键的形式发送数据。


现在如果是这种情况,您将无法使用 SwingDocumentListener/Document解决此问题。以下 Stack Overflow 问题基本上是指您遇到的相同问题(不同之处在于他们使用 qrcode 而不是条形码):ASCII Non printable characters in textcomponent


现在我链接的问题表明您可以使用 aKeyBinding或 KeyListener 来解决此问题。请注意,如果您想打印不可打印的字符,这将以某种方式破坏十六进制表示。


UTF-8 确实有一个用于 ASCII 不可打印字符表示的特殊代码点。“组分隔符的符号”位于\u241d。处理这个问题的一个选项是:


jtf1.getInputMap().put(KeyStroke.getKeyStroke(29), "handleGS");

jtf1.getActionMap().put("handleGS", new AbstractAction() {

    @Override

    public void actionPerformed(ActionEvent e) {

        jtf1.setText(jtf1.getText() + "\u241d");

    }

}

这样十六进制表示应该变成:


.. , 33, 34, e2, 90, 9d, 32, 31, 31, 30]

请注意,因为我们将 GS 重新映射到 Unicode 的“SYMBOL_FOR_GS”,所以我们得到的e2, 90, 9d不是1d.


查看完整回答
反对 回复 2022-01-12
  • 1 回答
  • 0 关注
  • 316 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信