【问题标题】:Python3 - Convert unicode literals string to unicode stringPython3 - 将 unicode 文字字符串转换为 unicode 字符串
【发布时间】:2020-03-15 12:15:23
【问题描述】:

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

【问题讨论】:

  • 请说明你想做什么。 '\u041f\u0440\u0438\u0432\u0435\u0442\u0021'字符串'Привет!'.
  • 澄清以上内容:该表示是 Python 的 only 表示,因为某些终端无法打印 Unicode。做这个简单的实验:打印出第一个字符的序数值。你会看到它是1055(十进制的0x41f),而不是92,反斜杠的值(也不是39——单引号——因为那是不是“字符串的一部分”,即使它也被 Python 打印出来)。

标签: python-3.x unicode python-unicode unicode-literals


【解决方案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 更简单、更健壮。但是,最佳解决方案取决于您要构建的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多