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 不可打印字符表示的特殊代碼點?!敖M分隔符的符號”位于\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.
添加回答
舉報