为何执行单行代码出现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编码字节(对应Dart
codeUnits的输出):用String.fromCharCodes(字节列表)恢复,该方法默认处理UTF-16编码单元:final recoveredString = String.fromCharCodes(codeUnitsList); - 如果不确定编码:可依次尝试UTF-8、UTF-16、Latin-1等常见编码,对比输出结果匹配原内容即可。比如Latin-1编码可使用
String.fromCharCodes(字节列表, encoding: latin1)。
内容的提问来源于stack exchange,提问作者TSR
相关产品推荐
相关产品推荐

