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

为何执行单行代码出现FormatException?如何恢复pdfString?

问题解决与说明

1. 代码报错原因及修复

你这段代码报错的核心是混淆了UTF-16和UTF-8编码逻辑:

  • Dart里的String.codeUnits返回的是字符串的UTF-16编码单元(16位整数),但utf8.decode()需要的是UTF-8格式的8位字节列表。直接把UTF-16编码单元传给UTF-8解码器,必然出现无效字节错误——尤其是字符串里的长破折号“–”(Unicode U+2013),它的UTF-16编码是单个单元0x2013,当成UTF-8字节解析时,0x13属于非法控制字符,直接触发了offset 11的格式异常。

修复方式很直接:pdfString本身就是合法的Dart字符串,直接打印即可:

final pdfString = " (T) 20.5 (–H) 4 (E) ]     % 5-element array of strings, reals, and intege";
print(pdfString); 

如果确实需要做“编码-解码”的流程,要先把字符串转成UTF-8字节再解码:

final pdfString = " (T) 20.5 (–H) 4 (E) ]     % 5-element array of strings, reals, and intege";
final utf8Bytes = utf8.encode(pdfString); // 先转成UTF-8字节
print(utf8.decode(utf8Bytes)); // 再解码即可正常输出

2. 仅拥有字节表示时恢复字符串的方法

要根据字节对应的编码格式来处理:

  • 如果是UTF-8编码字节:直接用utf8.decode(字节列表)恢复,若存在无效字节,可添加allowMalformed: true参数跳过错误,或指定替换字符:
    final recoveredString = utf8.decode(utf8Bytes, allowMalformed: true);
    
  • 如果是UTF-16编码字节(对应DartcodeUnits的输出):用String.fromCharCodes(字节列表)恢复,该方法默认处理UTF-16编码单元:
    final recoveredString = String.fromCharCodes(codeUnitsList);
    
  • 如果不确定编码:可依次尝试UTF-8、UTF-16、Latin-1等常见编码,对比输出结果匹配原内容即可。比如Latin-1编码可使用String.fromCharCodes(字节列表, encoding: latin1)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:05:03