我无法让它工作!我有一个文本文件,其中包含来自保存游戏文件解析器的许多UTF-8中文名称的字节形式,例如在source.txt中:
\xe6\x89\x8e\xe5\x8a\xa0\xe6\x8b\x89
但是,无论我如何将其导入Python(3或2),我得到的最好结果也是这个字符串:
\\xe6\\x89\\x8e\\xe5\\x8a\\xa0\\xe6\\x8b\\x89
我已尝试像其他帖子建议的那样,将字符串重新编码为UTF-8,然后使用unicode转义进行解码,如下所示:
stringName.encode("utf-8").decode("unicode_escape")
但这会破坏原有的编码,并将其作为字符串给出:
'æ\x89\x8eå\x8a\xa0æ\x8b\x89'(打印此字符串结果为:æå æ)
现在,如果我手动复制并粘贴 b + 文件名中的原始字符串,并对其进行编码,则可以获得正确的编码。例如:
b'\xe6\x89\x8e\xe5\x8a\xa0\xe6\x8b\x89'.encode("utf-8")
结果为:'扎加拉'
但是,我无法通过程序实现这一点。我甚至无法去掉双斜杠。
需要明确的是,source.txt 包含单个反斜杠。 我已尝试多种导入方式,但这是最常见的方法:
with open('source.txt','r',encoding='utf-8') as f_open:
source = f_open.read()
好的,我点击了下面的答案(我想是这个),但这是有效的:
from ast import literal_eval
decodedString = literal_eval("b'{}'".format(stringVariable)).decode('utf-8')
由于其他编码问题,我无法对整个文件进行操作,但是将每个名称作为字符串(stringVariable)提取,然后进行操作是可行的!谢谢!
更明确地说,原始文件不仅包含这些混乱的UTF编码。 它只在某些字段中使用它们。 例如,以下是该文件的开头:
{'m_cacheHandles': ['s2ma\x00\x00CN\x1f\x1b"\x8d\xdb\x1fr \\\xbf\xd4D\x05R\x87\x10\x0b\x0f9\x95\x9b\xe8\x16T\x81b\xe4\x08\x1e\xa8U\x11',
's2ma\x00\x00CN\x1a\xd9L\x12n\xb9\x8aL\x1d\xe7\xb8\xe6\xf8\xaa\xa1S\xdb\xa5+\t\xd3\x82^\x0c\x89\xdb\xc5\x82\x8d\xb7\x0fv',
's2ma\x00\x00CN\x92\xd8\x17D\xc1D\x1b\xf6(\xedj\xb7\xe9\xd1\x94\x85\xc8`\x91M\x8btZ\x91\xf65\x1f\xf9\xdc\xd4\xe6\xbb',
's2ma\x00\x00CN\xa1\xe9\xab\xcd?\xd2PS\xc9\x03\xab\x13R\xa6\x85u7(K2\x9d\x08\xb8k+\xe2\xdeI\xc3\xab\x7fC',
's2ma\x00\x00CNN\xa5\xe7\xaf\xa0\x84\xe5\xbc\xe9HX\xb93S*sj\xe3\xf8\xe7\x84`\xf1Ye\x15~\xb93\x1f\xc90',
's2ma\x00\x00CN8\xc6\x13F\x19\x1f\x97AH\xfa\x81m\xac\xc9\xa6\xa8\x90s\xfdd\x06\rL]z\xbb\x15\xdcI\x93\xd3V'],
'm_campaignIndex': 0,
'm_defaultDifficulty': 7,
'm_description': '',
'm_difficulty': '',
'm_gameSpeed': 4,
'm_imageFilePath': '',
'm_isBlizzardMap': True,
'm_mapFileName': '',
'm_miniSave': False,
'm_modPaths': None,
'm_playerList': [{'m_color': {'m_a': 255, 'm_b': 255, 'm_g': 92, 'm_r': 36},
'm_control': 2,
'm_handicap': 0,
'm_hero': '\xe6\x89\x8e\xe5\x8a\xa0\xe6\x8b\x89',
在“m_hero”字段之前的所有信息都不是UTF-8编码。因此,如果文件仅由这些虚假的UTF编码组成,则使用ShadowRanger的解决方案有效,但当我已将m_hero解析为字符串并尝试进行转换时,它无法正常工作。Karin的解决方案可以解决这个问题。
source.txt
中是否实际包含反斜杠,还是这只是 Python 显示的方式?另外,你是如何将其“导入”到 Python 中的?你正在从文件中读取吗?那个文件是怎么打开的? - mhawke