我已经有了在深层文件结构中迭代所有文件的代码,其中所有文件都是utf-8,需要转换为c1252 a.k.a。安西。
我需要达到和在任何严肃的文本编辑器中隐藏文件一样简单的结果.为什么会有损失呢?是的,有些字符被不同的字符标准地替换:Šš=ŠšČč=ÈèŤť=?Žž=ŽžĚě=ÌìŘř=ØøĎď=ÏïŇň=ÒòŮů=Ùù。
但是因为一个简单的字符串转换,比如
>>> print("Šš Čč Ťť Žž Ěě Řř Ďď Ňň Ůů".encode("utf-8").decode("cp1252"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files\Python310\lib\encodings\cp1252.py", line 15, in decode
return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 8: character maps to <undefined>..。不起作用我的机会有多大?整整一天,我都读了几十篇文章,没有找到一个可行的解决方案,也无法理解这个cp转换的根本原因。找到甚至完整的函数和转换器,显然是为Python 2编写的,没有工作。
也不起作用:
chcp 65001
Active code page: 65001
with open(fpath, mode="r", encoding="utf-8") as fd:
content = fd.read()
with open(fpath, mode="w", encoding="cp1252") as fd:
fd.write(content)或
with open(fpath, mode="r", encoding="utf-8") as fd:
decoded = fd.decode("utf-8")
content = decoded.encode("cp1252")发布于 2022-04-01 15:56:22
你的第一个例子是行不通的。使用一种方案对Unicode字符串进行编码和对另一种方案进行解码是不正确的,但您可以使用它生成的编码对文件或字节字符串进行解码,然后用另一种编码重新对其进行编码。然而,编码需要支持相同的Unicode代码点。
UTF-8支持编码所有Unicode代码点,而CP1252支持<256个,因此,如果您使用此路由,不要期望您的文件包含相同的信息。
在解码(读取)文件和编码(写入)文件时,可以使用errors参数。下面是一个示例字符串丢失的示例:
>>> s = "Šš Čč Ťť Žž Ěě Řř Ďď Ňň Ůů"
>>> s.encode('cp1252',errors='ignore').decode('cp1252')
'Šš Žž '
>>> s.encode('cp1252',errors='replace').decode('cp1252')
'Šš ?? ?? Žž ?? ?? ?? ?? ??'也有无损转换,但使用替代方案。请参阅Python文档中的错误处理程序。
因此,第二个示例可以通过提供errors参数来处理损失:
with open(fpath, mode="r", encoding="utf-8") as fd:
content = fd.read()
with open(fpath, mode="w", encoding="cp1252", errors='replace') as fd:
fd.write(content)https://stackoverflow.com/questions/71708761
复制相似问题