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

Encoding issues related to Python and foreign languages

这是我在编码和解码文本时遇到的问题。

我正在尝试编写一个代码来查找文件中的 'string' 或 'byte',以及 return 文件的路径。

目前,由于我打开的文件编码为 '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農場] 的 'binary' 文本是 [\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³õ]   €?‹  Œ  î...

我不确定如何将 'translate' '[跑Online農場]' 变成 '[¶]Online¹A³õ]'。回答这个也可能解决问题

我应该怎么做才能正确 'encode' Chinese/Foreign 字符,使其匹配 Python return 的 'rb' 字节?

谢谢!

你的encoding函数是错误的:文件的编解码器可能是CP950,但肯定不是CP1252。

注意:猜测给定字节串的编码总是近似的。 没有确定编码的安全方法。

如果你有一个像

这样的字节串
b'[\xb6]Online\xb9A\xb3\xf5]'

你知道它必须翻译(解码)成

'[跑Online農場]'

那么您可以尝试使用一些编解码器进行试错。

我用 list of codecs supported by Python 搜索中文的编解码器。

当使用 CP-1252(Latin-1 的 Windows 版本)时,如您所用,您会得到 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读取文件。