【问题标题】:Raw unicode literal that is valid in Python 2 and Python 3?在 Python 2 和 Python 3 中有效的原始 unicode 文字?
【发布时间】:2016-01-06 18:05:41
【问题描述】:

显然ur"" 语法在 Python 3 中已被禁用。但是,我需要它! “为什么?”,你可能会问。好吧,我需要 u 前缀,因为它是一个 unicode 字符串,我的代码需要在 Python 2 上运行。至于 r 前缀,也许它不是必需的,但我使用的标记格式需要很多反斜杠,这将有助于避免错误。

这是一个在 Python 2 中执行我想要但在 Python 3 中非法的示例:

tamil_letter_ma = u"\u0bae"
marked_text = ur"\a%s\bthe Tamil\cletter\dMa\e" % tamil_letter_ma

在遇到这个问题后,我找到http://bugs.python.org/issue15096 并注意到这句话:

克服限制很容易。

有人愿意提供一个想法吗?

相关:What exactly do "u" and "r" string flags do in Python, and what are raw string literals?

【问题讨论】:

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


    【解决方案1】:

    为什么不直接使用原始字符串文字 (r'....'),不需要指定 u,因为在 Python 3 中,字符串是 unicode 字符串。

    >>> tamil_letter_ma = "\u0bae"
    >>> marked_text = r"\a%s\bthe Tamil\cletter\dMa\e" % tamil_letter_ma
    >>> marked_text
    '\\aம\\bthe Tamil\\cletter\\dMa\\e'
    

    要使其在 Python 2.x 中也能正常工作,请在源代码的最开头添加 the following Future import statement,以便源代码中的所有字符串文字都变为 unicode。

    from __future__ import unicode_literals
    

    【讨论】:

    • 很有趣,但这会强制 all 字符串文字变成 unicode 字符串。这可能不切实际,并且恢复转义所有内容以便 Python 3 版本工作可能是最好的解决方案。
    • 根据PEP 414,有一个关于Unicode转义的警告when using from __future__ import unicode_literals in Python 2, the nominally "raw" Unicode string literals will process \uXXXX and \UXXXXXXXX escape sequences, just like Python 2 strings explicitly marked with the "raw Unicode" prefix
    【解决方案2】:

    首选方法是删除u'' 前缀并将from __future__ import unicode_literals 用作@falsetru suggested。但在您的具体情况下,您可能会滥用 "ascii-only string" % unicode 返回 Unicode 的事实:

    >>> tamil_letter_ma = u"\u0bae"
    >>> marked_text = r"\a%s\bthe Tamil\cletter\dMa\e" % tamil_letter_ma
    >>> marked_text
    u'\\a\u0bae\\bthe Tamil\\cletter\\dMa\\e'
    

    【讨论】:

      【解决方案3】:

      Unicode 字符串是 Python 3.x 中的默认值,因此单独使用 r 将产生与 Python 2 中的 ur 相同的结果。

      【讨论】:

      • -1;这忽略了问题的重点,即如何编写在 Python 2 和 Python 3 中同时有效的原始 unicode 文字。
      猜你喜欢
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2021-01-23
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多