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

red*_*red 1 python text-processing character-encoding

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

阅读部分如下:

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

doc_content=fin.read()
Run Code Online (Sandbox Code Playgroud)

Bor*_*lid 10

我要稍微改一下你的问题.我相信你会问,"我可以打开一个文件并将其读作好像是UTF-8,只要它实际上是ISO8869-xx或Windows-12xx,而不会丢失吗?".这就是您发布的Python代码尝试执行的操作.

这个问题的答案是否定的.你发布的Python代码会破坏文件,如果它们包含序号127以上的任何字符.这是因为"codepages"使用128到255之间的数字来表示每个字符,其中UTF-8使用该数字范围来代理多字节字符.因此,如果您错误地将文件解析为UTF-8,则文档中不是ASCII的每个字符都将被解释为无效字符串或将与后续字节组合以形成单个UTF-8代码点.

举个例子,假设你的文档在Windows-1252中.它包含字节序列0xC3 0xAE或"Ã"(A-tilde,注册商标符号).在UTF-8中,相同的字节序列代表一个字符"ï"(带有diaresis的小'i').在Windows-874中,相同的序列将是"รฎ".这些是相当不同的字符串 - 道德侮辱可能成为下棋的邀请,反之亦然.意义消失了.

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

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

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