2011-10-27 21 views
8

Tôi vừa mới bắt đầu mã hóa bằng NFC Android, tôi đã đọc và ghi thành công dữ liệu NDEF vào thẻ cổ điển mifare. Vấn đề là khi ứng dụng đọc tải trọng từ bản ghi ndef, nó luôn chứa ký tự '* en' ở đầu văn bản. Tôi nghĩ rằng đó là nhân vật ngôn ngữ, nhưng làm thế nào để có được tin nhắn văn bản thực sự mà không có nhân vật đó?Nhân vật lạ trên tải trọng bản ghi NDEF của Android

Đây là ảnh chụp màn hình những gì ứng dụng đọc từ thẻ nhưng văn bản thực là 'Hello World'

enter image description here Dưới đây là đoạn code để đọc

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

Tôi nghĩ "vi" xuất phát từ "tiếng Anh". Tôi gần như chắc chắn bạn đã vô tình thêm mã ngôn ngữ. Nếu bạn thay đổi thẻ ngôn ngữ trong xml của bạn, bạn có thể nhận được một chuỗi ký tự khác. Hãy thử điều đó, bởi vì cách này ít nhất bạn sẽ biết nơi nào en đến từ và bạn có thể tìm kiếm trên google cho một giải pháp. –

+0

Nếu bạn có thể đăng mã viết thẻ, nó sẽ hữu ích. Bạn đã thử sử dụng ứng dụng của người khác để đọc thẻ của bạn để xem nó có phải là cách bạn viết thẻ hay không hoặc liệu đó có phải là cách bạn đọc nó không? (Nếu nó hiển thị cùng một thông tin như trong Ndef Message, đó là một vấn đề ghi, nếu nó chỉ hiển thị "Hello World ..." thì đó là vấn đề đã đọc.) –

+0

Lajos, Ben ... cảm ơn nhận xét của bạn , tôi đã thử sử dụng ứng dụng khác, thông tin thẻ NFC, ứng dụng hiển thị 'Hello World'.Btw Tôi đã tìm thấy vấn đề, như Nils Pipenbrik giải thích dưới đây. Liên kết này http://code.google.com/p/openmobster/wiki/NFC hiển thị cách đọc dữ liệu tải trọng chính xác. –

Trả lời

14

Những gì bạn đang nhìn thấy là liệu dữ liệu của bản ghi văn bản NDef được chuyển thành UTF8.

Các NDEF văn bản kỷ lục là xây dựng như thế này:

Đầu byte: Control-Byte

Bit 7: 0: Các văn bản được mã hóa theo UTF-8 1: Các văn bản được mã hóa trong UTF16

Bit 6: RFU (pHẢI được thiết lập để không)

Bit 5..0: chiều dài của mã ngôn ngữ IANA.

Tiếp theo là mã ngôn ngữ, được lưu trữ bằng US-ASCII (trong trường hợp của bạn) như được định nghĩa trong RFC 3066. Độ dài của mã ngôn ngữ được cho trong byte điều khiển.

Và sau đó là văn bản ở định dạng như được chỉ định bởi bit 7 của byte điều khiển.

Ký tự vuông trống xuất phát từ việc chuyển đổi dữ liệu thô của bạn thành UTF-8. Tôi gần như chắc chắn rằng byte điều khiển trong trường hợp của bạn có giá trị số 2. Vì không có ký tự có thể in nào cho giá trị số này, nó được thay thế bằng ký tự giữ chỗ không thể in từ tập hợp unicode. Điều này thường được hiển thị dưới dạng hình vuông trống.

+1

Xin chào Nils, cảm ơn bạn đã trả lời, bây giờ tôi biết cách đọc dữ liệu tải trọng chính xác, liên kết này http : //code.google.com/p/openmobster/wiki/NFC cho biết cách thực hiện. ;) –

+1

Ngoài ra, đây là định nghĩa Loại Bản ghi Văn bản NDEF, hy vọng nó giúp người khác ..http: //www.maintag.fr/fichiers/pdf-fr/nfcforum-ts-rtd-text-1-0.pdf –

+0

Lần sau, vui lòng sao chép và dán các giá trị vào câu trả lời của bạn thay vì liên kết. Cả hai liên kết đều chết !! – nemicolopterus

Các vấn đề liên quan