与 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读取文件。
这是我在编码和解码文本时遇到的问题。
我正在尝试编写一个代码来查找文件中的 '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读取文件。