私は(スーパーマーケットでのもののような)GS1-DataMatrixのコードを読むことができる手持ちスキャナーを持っています。私はメモ帳でコードをスキャンすることができ++と私はFNC1文字がtransmitedている見ることができる(GSを 2210年前に、HEXで1D -最初の画像)
今、私はJavaから同じGS1コードを読み取るしようとしているが、動作していない、FNC1は、Javaで見られません。Javaでは、私は唯一の「01095011010209171719050810ABCD12342110」を参照してください。私はHEXに文字列を形質転換が、結果は同じであり、FNC1はHEXのいずれか(第2画像)ではありません。
これは、テストコードです:
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); }
@Override
public void changedUpdate(DocumentEvent e) { update(e); }
public void update(DocumentEvent e) {
try {
Document doc = (Document)e.getDocument();
String hex = String.format("%040x", new BigInteger(1, doc.getText(0, doc.getLength()).getBytes("UTF8"))); // transform to HEX
jtf2.setText(java.util.Arrays.toString(hex.split("(?<=\\G..)"))); // split hex data by 2 characters
jtf1.selectAll();
} catch (Exception ex) {
Logger.getLogger(GS1DataMatrix.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
f.add(jtf1);//adding button in JFrame
f.setSize(1000,500);
f.setLayout(null);
f.setVisible(true);
}
}
まず画像:これはメモ帳++がFNC1(読み込む方法であるGS黒の背景に特殊文字を):
第三の画像:スキャンごとにHEXで1DとしてFNC1を示すメモ帳++進ダンプ:
その後、編集、私は私のオリジナルのポストによって引き起こされる混乱があったと思う:私は、解析画像のない、スキャナは私のためにこれを行い、ハードウェアでのビルドを持って、私はテキストのみと一部の特殊文字(FNC1の)を受け取ります。
少し周りを読んだ後にいくつかの推測:
FNC1は、標準的な表現を持っていません。このstackoverflowの答えは、直接エンコードFNC1への道を送信するために使用されるデフォルトのLatin-1エンコーディングではありませんことを示唆しています。回避策として、ほとんどの読者は、ASCII制御文字「グループ・セパレータ」(GS、29、0x1Dの)をデフォルトとするように見えます。
あなたは、データを表示し、仕事にスイングコントロールを使用しています。スイングは、主に目的を表示するための、ない目的を扱う正しいデータを対象としています。
私はそれがJTextAreaにのコンテンツ内に設定していますとき、何が起こるかすると、そのスイングが非印字GSの文字をストリップされたと仮定します
あなたのスキャナがデータを転送していますが、「それはより多くのキーボードのようなものだ」に言及正確にどのようにについてひどく明示的じゃないことを考えると、私は、スキャナは、キーボードのふりをすることで、データを転送前提としています。あなたは、入力を選択スキャナのボタンを押すと、それがキー押下などのデータを送信しているはずです。
その場合は今、あなたはSwingのを使用することはできませんDocumentListener/Document
この問題を解決します。次のスタックオーバーフローの質問は基本的にあなたが(彼らは代わりにバーコードのQRコードを使用していることの違いを)持っているのと同じ問題を指しTextComponentにASCII以外の印刷可能文字
今、私はリンクの質問は、あなたがいることを示唆することができます使用してKeyBinding
この問題を解決するかの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]
我々は、Unicodeの「SYMBOL_FOR_GS」にGSを再マッピングするので、我々が得ることに注意してくださいe2, 90, 9d
代わりに1d
。