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 更简单、更健壮。但是,最好的解决方案是什么取决于您正在构建什么。
从命令行参数 (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 更简单、更健壮。但是,最好的解决方案是什么取决于您正在构建什么。