You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android读取NFC标签时出现异常字符问题求助

解决Android NFC读取蜂箱标签时的乱码问题

嘿,作为养蜂人用NFC管理蜂箱这个想法真的很酷!我来帮你搞定读取时的乱码问题——那些方块字符和多余的" Ten",本质是NDEF文本记录的结构没处理对,这是NFC开发里非常常见的小细节坑。

问题根源

NDEF文本记录的payload不是直接存纯文本的,它有固定的格式规范:

  • 第1个字节:最高位(bit7)是编码标识(0=UTF-8,1=UTF-16),低7位是语言代码的长度
  • 紧接着是对应长度的语言代码(比如en、zh)
  • 最后才是实际的文本内容

如果你的代码直接把文本字节塞进payload,或者编码/语言长度字段设置错误,解析时就会把这些不规范的字节当成语言信息,从而出现乱码(方块是解析失败的二进制内容,"Ten"可能是错误解析的语言代码片段)。

修正后的代码示例

下面是正确构建NDEF文本消息的getTestMessage方法,严格遵循NDEF规范:

private static NdefMessage getTestMessage() {
    // 替换成你的蜂箱标识文本
    String hiveTagText = "蜂箱#123 - 西蜂群";
    try {
        // 语言代码,这里用中文"zh",如果是英文可以用"en"
        byte[] languageBytes = "zh".getBytes("US-ASCII");
        // 文本内容用UTF-8编码(如果用UTF-16,记得把编码标识位设为1)
        byte[] textBytes = hiveTagText.getBytes("UTF-8");
        
        // 构建payload头部:低7位是语言代码长度,最高位0表示UTF-8
        int langLength = languageBytes.length;
        byte[] payload = new byte[1 + langLength + textBytes.length];
        payload[0] = (byte) langLength;
        
        // 复制语言代码到payload
        System.arraycopy(languageBytes, 0, payload, 1, langLength);
        // 复制实际文本内容到payload
        System.arraycopy(textBytes, 0, payload, 1 + langLength, textBytes.length);
        
        // 创建标准的NDEF文本记录
        NdefRecord textRecord = new NdefRecord(
            NdefRecord.TNF_WELL_KNOWN,
            NdefRecord.RTD_TEXT,
            new byte[0], // ID字段,不需要可以留空
            payload
        );
        
        return new NdefMessage(new NdefRecord[]{textRecord});
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return null;
    }
}

读取时的正确解析逻辑

读取标签时也要对应按规范解析,避免再次出现乱码,参考下面的解析方法:

private String parseHiveTagText(NdefRecord record) {
    try {
        byte[] payload = record.getPayload();
        // 判断编码格式:最高位为1是UTF-16,否则UTF-8
        boolean isUtf16 = (payload[0] & 0x80) != 0;
        // 获取语言代码长度:低7位
        int langCodeLength = payload[0] & 0x3F;
        
        // 跳过语言代码,读取实际文本
        String encoding = isUtf16 ? "UTF-16" : "UTF-8";
        return new String(
            payload, 
            1 + langCodeLength, 
            payload.length - 1 - langCodeLength, 
            encoding
        );
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return "解析失败";
    }
}

总结

你之前的问题就是因为没有按照NDEF文本记录的标准结构来构建payload,导致读取端错误解析了头部字节。用上面的代码重构你的消息生成和读取逻辑,应该就能彻底解决乱码问题啦,祝你管理蜂箱顺利!

内容的提问来源于stack exchange,提问作者kee01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:56:27