我无法使它正常工作!我有一个保存游戏文件解析器中的文本文件,其中有许多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的解决方案确实可以做到这一点。
我假设您使用的是Python3。在Python 2中,默认情况下字符串是字节,因此它对您来说是有效的。但是在Python
3中,字符串是unicode并被解释为unicode,如果将字节字符串读取为unicode,这会使这个问题更加棘手。
该解决方案受到了mgilson的回答的启发。我们可以使用以下方法从字面上将您的unicode字符串评估为字节字符串literal_eval
:
from ast import literal_eval
with open('source.txt', 'r', encoding='utf-8') as f_open:
source = f_open.read()
string = literal_eval("b'{}'".format(source)).decode('utf-8')
print(string) # 扎加拉
问题内容: 我有一个字符串“ \\ u003c”,它属于UTF-8字符集。由于存在双反斜杠,因此我无法将其解码为unicode。如何从“ \\ u003c”获取“ \ u003c”?我正在使用Java。 我尝试过 但无法实现我想要的。 这是我的代码 文件的内容是 \ u003c 问题答案: 不知道您是否仍在寻找解决问题的方法(因为您已经接受了答案),但是我仍然会添加我的答案作为针对 所述问题 的可
我正在处理一个使用UTF-8编码了两次的遗留文件。例如,编码点()本应编码为,但改为编码为(是的UTF-8编码,是的UTF-8编码)。 假设数据在CP-1252中编码,则执行第二次编码。 为了回到UTF-8编码,我使用了以下(似乎错误)命令 我的问题是iconv似乎无法转换回一些字符。更准确地说,iconv无法转换UTF-8表示形式包含映射到CP-1252中控制字符的字符。一个例子是代码点ρ():
问题内容: 这是一个“到底发生了什么”的问题。我实际上不需要解决方案。 我必须用双反斜杠替换字符串中的所有单反斜杠。这就是我最终要做的… …其中strRootDirectory是上面的java.lang.String。 现在,我了解了第一个参数的四个反斜杠:regex期望两个反斜杠以表示单个文字反斜杠,而Java希望它们加倍。没关系。 但是,第二个参数的八个反斜杠到底是怎么回事?替换字符串不是应该
我需要将python3中的替换为复杂字符串中的。我知道这个问题已经被问了好几次,但大多数时候都是针对简单字符串,所以没有一个(接受的)答案真正适用于复杂字符串。 这也不同于使用无法解决此问题。请参见下文。 假设字符串是: 直截了当的方法是: 这导致: 语法错误:扫描字符串文字时EOL 这个答案建议使用: 这导致: 所以,没有变化。 这个答案表明: 但是对于如此复杂的字符串,这并不适用: unico
许多发现都是针对python2的,我的例子是python3: 我需要把双背斜线换成单背斜线 这篇文章中的“接受答案”python3用单反斜杠替换双反斜杠在这里不起作用: 那么问题出在哪里呢?非常感谢。 [更新]: 由于@ShadowRanger的回复,所以如果在替换操作后打印字符串,它是预期的,但是,在我的情况下,我需要连接替换后生成另一个变量(conn_str),正如你所看到的,它仍然显示双反斜
问题内容: 我正在尝试将转换为,但是我不断遇到各种错误。我认为这是解决方案: 但这给出了以下异常: 问题答案: 将该参数解释为正则表达式。该是转义字符都 和。你需要对正则表达式进行两次转义: 但是你不必为此使用正则表达式,仅是因为你希望逐个字符地进行精确替换,并且这里不需要模式。因此就足够了: 更新:根据注释,你似乎想在JavaScript上下文中使用字符串。你最好使用它来覆盖更多字符。
我正在尝试用单个反斜杠替换所有双反斜杠。我想将替换为。我以为python将视为一个反斜杠,将视为带有两个反斜杠的字符串。但是当我尝试时 因此,我尝试用原始字符串切换替换字符串: 这不是我需要的。所以我只尝试了原始字符串中的一个反斜杠:
本文向大家介绍PHP 将ASCII转换为UTF-8编码,包括了PHP 将ASCII转换为UTF-8编码的使用技巧和注意事项,需要的朋友参考一下 如果我们知道当前的编码是ASCII,则可以使用'iconv'函数将ASCII转换为UTF-8。原始字符串可以作为参数传递给iconv函数,以将其编码为UTF-8。 示例 具有特殊字符的字符串被分配给'str'变量。它以当前所在的编码以及需要转换为的编码传递