亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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 不可打印字符表示的特殊代碼點?!敖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.


查看完整回答
反對 回復 2022-01-12
  • 1 回答
  • 0 關注
  • 412 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號