当我从一个大的txt文件中逐个读取数据时,我得到的错误是:
未完成的UTF-8八进制序列(在偏移量4096处)代码:
File file = File(path!);
RandomAccessFile _raf = await file.open();
_raf.setPositionSync(skip ?? 0);
var data = _raf.readSync(block);// block = 64*64
content.value = utf8.decode(data.toList());发布于 2021-09-02 10:39:26
UTF*8是可变长度编码。错误来自于数据不对齐UTF8边界,可选的方法是在调用utf.decode之前修剪左、右的数据字节,这将丢失第一个和最后一个字符。您可以读取和添加更多字节,以覆盖最后一个字符并与utf8边界对齐。
bool isDataByte(int i) {
return i & 0xc0 == 0x80;
}
Future<void> main(List<String> arguments) async {
var _raf = await File('utf8.txt').open();
_raf.setPositionSync(skip);
var data = _raf.readSync(8 * 8);
var utfData = data.toList();
int l, r;
for (l = 0; isDataByte(utfData[l]) && l < utfData.length; l++) {}
for (r = utfData.length - 1; isDataByte(utfData[r]) && r > l; r--) {}
var value = utf8.decode(utfData.sublist(l, r));
print(value);
}可选读取更多4个字节并展开以覆盖最后一个字符
bool isDataByte(int i) {
return i & 0xc0 == 0x80;
}
Future<void> main(List<String> arguments) async {
var _raf = await File('utf8.txt').open();
_raf.setPositionSync(skip);
var block = 8 * 8;
var data = _raf.readSync(block + 4);
var utfData = data.toList();
int l, r;
for (l = 0; isDataByte(utfData[l]) && l < block; l++) {}
for (r = block; isDataByte(utfData[r]) && r < block + 4; r++) {}
var value = utf8.decode(utfData.sublist(l, r));
print(value);
}https://stackoverflow.com/questions/69026727
复制相似问题