与Python和外语有关的编码问题

问题描述 投票:0回答:1

我在编码和解码文本方面遇到了一个问题。

我想写一个代码,在文件中找到一个 "字符串 "或 "字节",然后返回文件的路径。

目前,由于我打开的文件的编码是'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 "字节相匹配?

谢谢你!我在编码和解码文本时遇到了这样一个问题。

python-3.x unicode encoding byte decoding
1个回答
1
投票

你的 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来读取文件。

© www.soinside.com 2019 - 2024. All rights reserved.