12

Android NFC でコーディングを開始したばかりで、NDEF データの読み取りと mifare クラシック タグへの書き込みに成功しました。問題は、アプリが ndef レコードからペイロードを読み取るときに、テキストの先頭に常に文字「*en」が含まれていることです。言語の文字だと思いますが、その文字なしで実際のテキストメッセージを取得するにはどうすればよいですか?

これは、アプリがタグから読み取ったスクリーンショットです。実際のテキストは「Hello World」です

ここに画像の説明を入力 読むコードはこちら

@Override
public void onNewIntent(Intent intent) {
    Log.i("Foreground dispatch", "Discovered tag with intent: " + intent);
   // mText.setText("Discovered tag NDEF " + ++mCount + " with intent: " + intent);

    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

        if (rawMsgs != null) {
            NdefMessage[] msgs = new NdefMessage[rawMsgs.length];

            for (int i = 0; i < rawMsgs.length; i++) {
                msgs[i] = (NdefMessage) rawMsgs[i];
            }

            NdefMessage msg = msgs[0];

            try {
            mText.setText(new String(msg.getRecords()[0].getPayload(), "UTF-8"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
4

3 に答える 3

16

表示されているのは、UTF8 に変換された NDef テキスト レコードの生データです。

NDef テキスト レコードは次のように作成されます。

最初のバイト: コントロール バイト

ビット 7: 0: テキストは UTF-8 でエンコードされます 1: テキストは UTF16 でエンコードされます

ビット 6: RFU (ゼロに設定する必要があります)

ビット 5..0: IANA 言語コードの長さ。

この後に、RFC 3066 で定義されているように、US-ASCII (この場合は en) で格納された言語コードが続きます。言語コードの長さは制御バイトで指定されます。

この後に、制御バイトのビット 7 で指定された形式のテキストが続きます。

空の四角形の文字は、生データを UTF-8 に変換した結果です。あなたの場合の制御バイトには数値2があるとほぼ確信しています。この数値には印刷可能な文字がないため、Unicodeセットの印刷できないプレースホルダー文字に置き換えられます。これは通常、空の四角として表示されます。

于 2011-10-27T16:11:46.187 に答える