1

从命令行参数 ( 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 字符串'Привет!'

4

1 回答 1

1

您不必将其转换为 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 更简单、更健壮。但是,最佳解决方案取决于您正在构建的内容。

于 2020-03-15T12:35:12.367 回答