Skip to main content
 首页 » 编程设计

python之UTF-8 字符是否涵盖了 ISO8859-xx 和 windows-12xx 的所有编码

2025年05月04日9Free-Thinker

我正在尝试用 python 从一堆具有不同编码的文档中编写一个通用文档索引器。我想知道是否可以使用 utf-8 读取我的所有文档(使用 utf-8、ISO8859-xx 和 windows-12xx 编码)而不丢失字符?

阅读部分如下:

fin=codecs.open(doc_name, "r","utf-8"); 
 
doc_content=fin.read() 

请您参考如下方法:

我将稍微改一下您的问题。我相信您在问,“如果它实际上是 ISO8869-xx 或 Windows-12xx,我可以打开一个文档并像 UTF-8 一样阅读它吗?”。这就是您发布的 Python 代码尝试执行的操作。

这个问题的答案是否。如果您发布的 Python 代码包含序数 127 以上的任何字符,它们将破坏文档。这是因为“代码页”使用从 128 到 255 的数字分别代表一个字符,其中 UTF-8 使用该数字范围来代理多字节字符.因此,如果您错误地将文件解析为 UTF-8,文档中不在 ASCII 中的每个字符将被解释为无效字符串,或者将与后续字节组合以形成单个 UTF-8 代码点.

举个具体的例子,假设您的文档在 Windows-1252 中。它包含字节序列 0xC3 0xAE,或“î”(波浪号,注册商标符号)。在 UTF-8 中,相同的字节序列表示一个字符“ï”(带分音符的小“i”)。在 Windows-874 中,相同的序列将是“รฎ”。这些是相当不同的字符串 - 道德侮辱可能会成为下棋的邀请,反之亦然。失去了意义。

现在,对于一个稍微不同的问题——“我可以将我的文件从当前编码无损地转换为 UTF-8 吗?”或者,“我可以将当​​前文件中的所有数据表示为 UTF-8 字节流吗?”。这些问题的答案是(模数一些模糊位)是。 Unicode 旨在为任何先前存在的代码页中的每个表意文字提供一个代码点,并且总的来说已经成功实现了这一目标。有一些粗糙的边缘,但使用 Unicode 作为通用交换格式可能会为您提供良好的服务(UTF-8 是一种很好的表示形式)。

但是,要实现转换,您必须已经知道并说明文件在读取时的格式。否则 Python 将错误地处理非 ASCII 字符,并且您将严重损坏您的文本(事实上,如果您丢弃无效的 UTF8 序列或特定错误转换的字节范围的来源,将无法挽回)。

如果文本是全部,100% ASCII,您可以毫无问题地将其作为 UTF-8 打开,因为前 127 个代码点是共享的两种表示。