Python unicode在读取其他应用程序生成的文件时出错



从多个应用程序读取导出文件时,我收到解码异常错误。我已经遇到这个问题一个月了,因为我对unicode的了解比我想知道的要多得多。一些基本面仍然缺失。我理解utf,我理解代码页,我理解它们在实践中的使用方式(例如,每个文档只有一个代码页,尽管我无法想象今天仍然如此——请参阅15种语言的健康声明的背面。(

  1. utf-8可以并且确实编码每一个可能的unicode字符,这是真的吗?那么,一个应用程序怎么可能写一个utf-8文件,而另一个则无法读取它呢
  2. 当使用utf时,不使用代码页,这是正确的吗?正如我所想的,代码页是一种较旧的样式,已被utf废弃。我相信也有一些例外
  3. utf也可以看作是一种数据压缩方案,而不是编码方案

但我被卡住了,在实践中,我有6个不同的应用程序在不同的国家制造,它们可以创建导出文件,其中3个在ut-f中,3个在cp1252中,但python 3.7无法读取它们而不会出错:

"charmap"编解码器无法解码位置1555855中的字节0x9d:字符映射到"charmap"编解码器无法解码位置4179683中的字节0x81:字符映射到

我使用Edit Pro来检查文件,它成功地读取了文件。它指向一行,该行包含一对额外的特殊双引号:"Metro Exodus评论:"它不仅是迄今为止最好的Metro,也是多年来最好的射手之一"|GamesRadar+">

删除"允许python继续读取文件,直到出现下一个错误。

python报告它为charx9d,但一个(非常旧的:Codewright(旧编辑器报告它为x94。Codewright我相信。在互联网上验证了它是x94和x93对,所以它必须是真的。;-(

这是非常麻烦的,我不确定实际的字节是什么,因为有这么多层的翻译、解释、显示格式等。

因此,x9d的visualstudio调试报告是一个误导。python库是怎么回事,它会报告这一情况?

这怎么可能?我找不到关于一个代码页中的字符在utf下如何无效的信息(如果有问题的话(。我会在什么下面搜索?

不应该这么难。我有30年的编程经验,c++,sql,你能想到的,学习新的库,语言只是早餐。

我也不明白为什么处理这件事的信息如此难以找到。当然,几十年来,许多其他程序员在进行数据转换、应用程序之间的导入/导出时也遇到过这种情况。

我正在导入的文件是来自6个应用程序的csv文件,以及来自另一个应用程序中的json文件。6个应用程序在utf-8和cp1252中导出(如Edit Pro所报告的(,而另一个应用程序则在utf-8中导出json,尽管我也可以选择csv。

这6个应用程序在iPhone上运行,并导出我试图在windows 10上读取的文件。我运行的是python 3.7.8,尽管这个问题从3.6.3开始就一直存在。

提前感谢

Dan

错误'charmap' codec can't decode byte...表明您没有使用utf-8读取文件。这就是你在这件事上挣扎的根源。除非文件以BOM(字节顺序标记(开头,否则您必须知道文件是如何编码的才能正确解码。

  1. utf-8编码所有unicode字符,python应该能够读取所有字符。显示是另一回事。您需要unicode字符的字体文件来完成这一部分。你在读";charmap";,而不是";utf-8";这就是你犯错误的原因。

  2. "当使用utf时"。。。存在几种UTF编码。utf-8、utf-16-be(big-endian(、utf-16le(little-endian(、utf-16(utf-16-le的同义词(、utf-32变体(我从未在野外见过(以及包括BOM(字节顺序标记(的变体,BOM是描述utf编码类型的文件开头的一组可选字符。

但是,是的,UTF编码旨在取代旧的代码页编码。

  1. 不,不是压缩。编码流可能大于在内存中保存字符串所需的字节数。utf-8尤其如此,而utf-16则不然(这就是微软选择utf-16的原因(。但是utf-8作为ASCII的超集,没有像utf-16那样的字节顺序问题,还有很多其他优点(这就是为什么所有理智的人都选择它的原因(。我想不出UTF编码会小于其字符数的情况

最新更新