linux - Utf8 编码的文件在解析过程中产生 UnicodeDecodeError

标签 linux utf-8 character-encoding qiime

我正在尝试重新格式化文本文件,以便将其上传到管道 (QIIME2) - 我测试了 .txt 文件的前几行(但它是制表符分隔的),并且转换成功。但是,当我尝试对整个文件运行脚本时,我遇到了一个错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 16: invalid start byte

我已经确定文件编码是utf8,所以我不确定问题出在哪里。

$ file filename.txt
filename: UTF-8 Unicode text, with very long lines, with CRLF line terminator

我还检查了一些与错误相关的行,但我无法直观地识别任何非正统字符。

我尝试使用以下方法对其进行强制编码:

$iconv -f UTF8 -t UTF8 filename.txt > new_file.txt

但是,产生的错误是:

iconv: illegal input sequence at position 152683

我的理解是,使用 utf-8 编码无法读取/翻译该位置出现的任何字符,但我不确定为什么文件被称为以 utf-8 编码。

我在 Linux 上运行它,数据本身是来自 BOLD 数据库的序列信息(如果其他人在尝试将其转换为适合 QIIME2 的格式时遇到类似问题)。

最佳答案

file 错误。 file 命令不会读取整个文件。它基于文件的一些样本进行猜测。我没有这方面的源引用,但是 file 在大文件上的速度非常快,没有其他解释。

我猜你的文件一开始实际上是 UTF-8,因为 UTF-8 具有特征字节序列。一段文本看起来像 UTF-8 而实际上不是的可能性很小。

但是包含字节0x96的文本部分不能是UTF-8。很可能某些文本使用 CP1252 等 8 位编码进行编码,然后连接到 UTF-8 文本。这是不应该发生的事情,因为现在您在一个文件中有多种编码。这样的文件在文本编码方面是错误的。

这只是猜测,但根据我的经验,这是对您描述的情况最可能的解释。

对于编码损坏的文本,您可以使用第三方 Python 库 ftfy: fixes text for you . 它会在每个换行符处剪切您的文本,并尝试为每个部分找到(猜测)正确的编码。 它并不总是神奇地做正确的事,但它非常好。

为了给您更详细的指导,您必须显示您正在调用的脚本的代码(如果这是您的代码并且您想修复它)。

关于linux - Utf8 编码的文件在解析过程中产生 UnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56243274/

相关文章:

php - utf8 字符在转换为 mysqli_query() 后错误地显示为问号

java - 从 Java 中的字符串中删除 BOM

php - Jquery ajax post 将阿拉伯字符发送到 php 和 mysql 查询,例如

linux - 如何将间隔添加到存储在变量中的日期/时间

java - 从 Java 运行 "who -m"命令会产生空结果

mysql - 为什么导入 SQL 这么慢?

linux - 使用匹配的第一列增加第二列

c# - 如何统计日英混合字符串所需的列数?

java - 如何对齐 Java 中的下一行?

winapi - 如何在编码之间获得最适合的 unicode 字符映射