Странный персонаж на Android NDEF запись полезной нагрузки - PullRequest
8 голосов
/ 27 октября 2011

Я только начал кодировать с помощью Android NFC, я успешно прочитал и записал данные NDEF в классический тег mifare. Проблема заключается в том, что когда приложение считывает полезную нагрузку из записи ndef, она всегда содержит символ '* en' в начале текста. Я думаю, что это символ языка, но как получить реальное текстовое сообщение без этого символа?

Это скриншот того, что приложение читает из тега, фактический текст «Hello World»

enter image description here Вот код для чтения

@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();
            }
        }
    }
}

1 Ответ

14 голосов
/ 27 октября 2011

То, что вы видите, это необработанные данные текстовой записи NDef, преобразованной в UTF8.

Текстовая запись NDef строится так:

Первый байт: управляющий байт

Бит 7: 0: текст закодирован в UTF-8 1: текст закодирован в UTF16

Бит 6: RFU (ДОЛЖЕН быть установлен в ноль)

Бит 5..0: длина кода языка IANA.

Далее следует код языка, сохраненный в US-ASCII (в вашем случае en), как определено в RFC 3066. Длина кода языка указана в байте управления.

После этого следует текст в формате, указанном битом 7 управляющего байта.

Символ пустого квадрата получается при преобразовании необработанных данных в UTF-8. Я почти уверен, что управляющий байт в вашем случае имеет числовое значение 2. Поскольку для этого числового значения нет печатного символа, он заменяется непечатаемым символом-заполнителем из набора Юникод. Обычно это отображается как пустой квадрат.

...