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.
添加回答
举报