您不必将其转换为 Unicode,因为它已经是Unicode。在 Python 3.x 中,字符串默认为 Unicode。bytes
仅当您想要读取或写入字节时(例如,写入文件时)才需要将它们转换(到或从)。
如果你只是打印字符串,你会得到正确的结果,假设你的终端支持这些字符。
print('\u041f\u0440\u0438\u0432\u0435\u0442\u0021')
这将打印:
Привет!
更新
更新您的问题后,我很清楚提到的字符串并不是真正的字符串文字(或 unicode 文字),而是来自命令行的输入。在这种情况下,您可以使用“unicode-escape”编码来获得您想要的结果。请注意,编码工作从 Unicode 到字节,而解码工作从字节到 Unicode。在这种情况下,您需要从 Unicode 转换为 Unicode,因此您必须添加一个使用 latin-1 编码的“虚拟”解码步骤,它将 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 更简单、更健壮。但是,最佳解决方案取决于您正在构建的内容。