1 回答

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
閱讀后的一些猜測:
FNC1 沒有標(biāo)準(zhǔn)表示。 這個(gè) stackoverflow 答案表明,沒有辦法在用于傳輸?shù)哪J(rèn) Latin-1 編碼中直接對 FNC1 進(jìn)行編碼。作為一種解決方法,大多數(shù)讀者似乎默認(rèn)使用 ASCII 控制字符“組分隔符”(GS、29、0x1d)。
您正在使用擺動(dòng)控件來顯示和處理數(shù)據(jù)。Swing 主要用于顯示目的,而不是用于正確的數(shù)據(jù)處理目的。
我假設(shè)發(fā)生的情況是當(dāng)它在 JTextArea 的內(nèi)容中設(shè)置時(shí),swing 會(huì)剝離不可打印的 GS 字符
考慮到您對掃描儀傳輸數(shù)據(jù)的確切方式并不十分明確,但您提到“它更像是鍵盤”,我假設(shè)掃描儀通過假裝是鍵盤來傳輸數(shù)據(jù)。您將選擇輸入,按下掃描儀上的按鈕,它將以按鍵的形式發(fā)送數(shù)據(jù)。
現(xiàn)在如果是這種情況,您將無法使用 SwingDocumentListener/Document解決此問題。以下 Stack Overflow 問題基本上是指您遇到的相同問題(不同之處在于他們使用 qrcode 而不是條形碼):ASCII Non printable characters in textcomponent
現(xiàn)在我鏈接的問題表明您可以使用 aKeyBinding或 KeyListener 來解決此問題。請注意,如果您想打印不可打印的字符,這將以某種方式破壞十六進(jìn)制表示。
UTF-8 確實(shí)有一個(gè)用于 ASCII 不可打印字符表示的特殊代碼點(diǎn)?!敖M分隔符的符號”位于\u241d。處理這個(gè)問題的一個(gè)選項(xiàng)是:
jtf1.getInputMap().put(KeyStroke.getKeyStroke(29), "handleGS");
jtf1.getActionMap().put("handleGS", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
jtf1.setText(jtf1.getText() + "\u241d");
}
}
這樣十六進(jìn)制表示應(yīng)該變成:
.. , 33, 34, e2, 90, 9d, 32, 31, 31, 30]
請注意,因?yàn)槲覀儗?GS 重新映射到 Unicode 的“SYMBOL_FOR_GS”,所以我們得到的e2, 90, 9d不是1d.
添加回答
舉報(bào)