如何使 Python 将文字字符串视为 UTF-8 编码的字符串 [duplicate]

How to make Python treat literal string as UTF-8 encoded string [duplicate]

提问人:Stine Nyhus 提问时间:3/26/2023 最后编辑:TomerikooStine Nyhus 更新时间:3/26/2023 访问量:179

问:

我从文件中加载了一些 Python 字符串。它们看起来像列表,但实际上是字符串,例如:

example_string = '["hello", "there", "w\\u00e5rld"]'

我可以轻松地将其转换为实际的字符串列表:

def string_to_list(string_list:str) -> List[str]:
    converted = string_list.replace('"', '').replace('[', '').replace(']', '').split(',')
    return [s.strip() for s in converted]
as_list = string_to_list(example_string)
print(as_list) 

这将返回以下字符串列表: 问题在于字符串最后一个元素的编码。我跑步时看起来像这样,但是如果我跑步["hello", "there", "w\\u00e5rld"]print(as_list)

for element in as_list:
    print(element)

它返回

hello
there
w\u00e5rld

我不知道第一个反斜杠会发生什么,在我看来,它似乎是为了逃避编码中的第二个反斜杠。如何让 Python 只解析 UTF-8 字符并打印“wørld”?问题是它是一个字符串,而不是编码,所以不起作用。as_list[2].decode("UTF-8")

我尝试使用 string.decode(),并尝试纯打印

python-3.x utf-8

评论

0赞 ShadowRanger 3/26/2023
@Tomerikoo:有趣的是,他们找到了自己胡说八道的方式来做这个问题所要求的所有事情,但是是的,这个问题从一开始就解决了他们的整个问题。
1赞 Tomerikoo 3/26/2023
@ShadowRanger我本来只是想把它作为一个方面,而不是,但在意识到它甚至解决了问题之后,我认为它可以用作复制品......我也很确定您对该模块的评论在某处有重复astcodecs
0赞 Tomerikoo 3/26/2023
找到了。假设他们只有一个字符串 - 会起作用"w\\u00e5rld".encode('latin-1', 'backslashreplace').decode('unicode-escape')
0赞 ShadowRanger 3/26/2023
@Tomerikoo:更直接(但需要导入),你就可以做.您必须将该模块用于单步文本转文本方法,因为您不能调用 .codecs.decode("w\\u00e5rld", 'unicode-escape')codecs.decodestr

答:

1赞 ShadowRanger 3/26/2023 #1

将其解码为字符串的正确方法不是您正在执行的一组疯狂的字符串操作。它只是 ast.literal_eval(example_string),它可以很好地处理 Unicode 转义:list

    import ast
    
    example_string = '["hello", "there", "w\\u00e5rld"]'
    example_list = ast.literal_eval(example_string)
    for word in example_list:
        print(word)

假设您对字符有适当的字体支持,则输出:

hello
there
wårld

如果您绝对需要修复 Unicode 转义,则可以使用 codecs 模块进行unicode_escape解码,但在这种情况下,您在字符串中有一个合法的 Python 文本,并且可以完成所有工作。ast.literal_eval

评论

0赞 Mark Tolonen 3/26/2023
在本例中,字符串可能是用 . -> . 当字符串是单引号和非 JSON 时,通常需要它。json.dumpsensure_ascii=Truejson.loads(example_string)['hello', 'there', 'wårld']ast.literal_eval
0赞 ShadowRanger 3/26/2023
@MarkTolonen:没错,任何一个都可以。 更快的 IIRC,假设输入是有保证的 JSON,这比 Python 文字更受限制。json.loads