Python3 - 将 unicode 文字字符串转换为 unicode 字符串

Python3 - Convert unicode literals string to unicode string

从命令行参数 (sys.argv) 我收到了这样的 unicode 文字字符串:'\u041f\u0440\u0438\u0432\u0435\u0442\u0021'

例如这个脚本 uni.py:

import sys
print(sys.argv[1])

命令行:

python uni.py \u041f\u0440\u0438\u0432\u0435\u0442\u0021

输出:

\u041f\u0440\u0438\u0432\u0435\u0442\u0021

我想把它转成unicode字符串'Привет!'

您不必将其转换为 Unicode,因为它已经 Unicode。在 Python 3.x 中,字符串默认为 Unicode。当您想要读取或写入字节时,例如,当写入文件时,您只需将它们转换(与 bytes 或从 bytes 转换)。

如果你只打印字符串,你会得到正确的结果,前提是你的终端支持这些字符。

print('\u041f\u0440\u0438\u0432\u0435\u0442\u0021')

这将打印:

Привет!

更新

更新你的问题后,我清楚地知道提到的字符串并不是真正的字符串文字(或 unicode 文字),而是从命令行输入的。在这种情况下,您可以使用 "unicode-escape" 编码来获得您想要的结果。 请注意,编码是从 Unicode 到字节,解码是从字节到 Unicode。在这种情况下,您需要从 Unicode 到 Unicode 的转换,因此您必须使用 latin-1 编码添加 "dummy" 解码步骤,这会透明地将 Unicode 代码点转换为字节。

以下代码将为您的示例打印正确的结果:

text = sys.argv[1].encode('latin-1').decode('unicode-escape')
print(text)

更新 2

或者,您可以使用 ast.literal_eval() 从输入中解析字符串。但是,此方法需要一个正确的 Python 文字,包括引号。你可以做类似的事情来解决这个问题:

text = ast.literal_eval("'" + sys.argv[1] + "'")

但请注意,如果您将引号作为输入字符串的一部分,这将中断。我认为这有点 hack,因为该方法可能不适用于您使用它的目的。 unicode-escape 更简单、更健壮。但是,最好的解决方案是什么取决于您正在构建什么。