我在编码和解码文本方面遇到了一个问题。
我想写一个代码,在文件中找到一个 "字符串 "或 "字节",然后返回文件的路径。
目前,由于我打开的文件的编码是'windows-1252'或'cp-1252',所以我一直在尝试:1.将我的字符串编码成与文件编码相对应的字节2.匹配文件并得到该文件的路径。
我有一个文件,比如说'f',它的编码是'windows-1252'或'cp-1252'。它包括一个中文的文本。'[跑Online農場]'
with open(os.path.join(root, filename), mode='rb') as f:
text = f.read()
print(encoding(text)) # encoding() is a separate function that I wrote that returns the encoding of the file
print(text)
Windows-1252
b'\x00StaticText\x00\x00\x12\x00[\xb6]Online\xb9A\xb3\xf5]\x00\x01\x00\x ...
正如你所看到的,二进制的文本是: [跑Online農場]
是 [\xb6]Online\xb9A\xb3\xf5]
然而,有趣的是,如果我把字符串转换成字节,我得到的是。
enter_text = '[跑Online農場]'
print(bytes(enter_text, 'cp1252'))
UnicodeEncodeError: 'charmap' codec can't encode character '\u8dd1' in position 1: character maps to <undefined>
另一方面,打开文件,用
with open(os.path.join(root, filename), mode='r', encoding='cp-1252') as f ...
我明白了。
StaticText [¶]Online¹A³õ] €?‹ Œ î...
我不知道该如何 "翻译 '[跑Online農場]'
变成 '[¶]Online¹A³õ]'
. 回答这个问题也可以解决问题
我应该怎么做才能正确地 "编码 "ChineseForeign字符,使其与Python返回的 "rb "字节相匹配?
谢谢你!我在编码和解码文本时遇到了这样一个问题。
你的 encoding
函数是错误的:文件的编码可能是CP950,但肯定不是CP1252。
注意:猜测一个给定字节串的编码总是近似的,没有安全的方法可以确定编码。
如果你有一个字节串,如
b'[\xb6]Online\xb9A\xb3\xf5]'
而你知道它必须翻译成
'[跑Online農場]'
然后你可以是试错与一些编解码器。
我做了这个与 Python支持的编解码器列表,搜索中文的编解码器。
当使用CP-1252(Windows版本的Latin-1)时,就像你一样,你得到的是mojibake。
>>> b'[\xb6]Online\xb9A\xb3\xf5]'.decode('cp1252')
'[¶]Online¹A³õ]'
当使用CP-950(Windows的繁体中文编码页)时,你会得到预期的输出。
>>> b'[\xb6]Online\xb9A\xb3\xf5]'.decode('cp950')
'[跑Online農場]'
所以:使用CP-950来读取文件。