【问题标题】:What's the u prefix in a Python string?Python 字符串中的 u 前缀是什么?
【发布时间】:2011-01-28 17:28:19
【问题描述】:

喜欢:

u'Hello'

我的猜测是它表示“Unicode”,对吗?

如果有,从什么时候开始提供?

【问题讨论】:

    标签: python syntax


    【解决方案1】:

    我来到这里是因为我的requests 输出出现了funny-char-syndrome。我以为response.text 会给我一个正确解码的字符串,但在输出中我发现了有趣的双字符,而德国元音变音应该是。

    原来response.encoding 不知何故为空,所以response 不知道如何正确解码内容,只是将其视为 ASCII(我猜)。

    我的解决方案是使用“response.content”获取原始字节并手动将decode('utf_8') 应用于它。结果是 schöne Umlaute。

    正确解码

    für

    对比解码不当

    fĂźr

    【讨论】:

      【解决方案2】:

      你是对的,见3.1.3. Unicode Strings

      这是自 Python 2.0 以来的语法。

      Python 3 使它们变得多余,因为默认的字符串类型是 Unicode。 3.0 到 3.2 版本删除了它们,但它们是 re-added in 3.3+ 以与 Python 2 兼容以帮助 2 到 3 的转换。

      【讨论】:

      • 应该补充一点,在 Python 3 中不再需要它,但仍然是有效的语法。
      • 结合 unicode + 原始(正则表达式)字符串(例如ur"string")在 Python 2 中是有效的,但不幸的是它在 Python 3 中是无效的语法。
      【解决方案3】:

      我的猜测是它表示“Unicode”,对吗?

      是的。

      如果有,从什么时候开始?

      Python 2.x.

      在 Python 3.x 中,字符串默认使用 Unicode,并且不需要 u 前缀。 注意: 在 Python 3.0-3.2 中,u 是语法错误。在 Python 3.3+ 中,让编写 2/3 兼容的应用程序变得更容易再次是合法的。

      【讨论】:

      • 在 Python 3 中使用 u 前缀甚至是一个语法错误。
      • @TimPietzcker:仅在 3.0-3.2 中;在 3.3+ 中它是合法的(并且没有意义),以便更轻松地编写 2.6+/3.3+ 单代码库和应用程序。
      • @abarnert:嗯,这个评论现在已经有四年半的历史了:)
      • @TimPietzcker:当然,但是正如您的评论对于任何在 2010 年通过搜索找到这个有用答案的人来说是一个有用的附录,我认为向任何在 2014 年找到它的人提及 3.3 中的变化是很有用的。编辑答案可能会更好,但我认为这是大多数人不会遇到的小问题(因为除非你在 2014 年仍在使用 3.0-3.2,否则“不需要前缀”就是你所需要的知道)。
      • 如果您正在编写供任意用户下载和运行的代码,并且希望在不做任何假设的情况下涵盖最可能的情况,那么了解 3.0-3.2 将会崩溃会很有帮助。因为您需要决定是否愿意在任何地方使用six.text_type() 来处理仍在使用 3 的(希望是微乎其微的)人数。[012] - 至少信息在那里,所以你可以选择。
      【解决方案4】:

      这是 Unicode。

      只需将变量放在str() 之间即可。

      但如果您有两个如下列表:

      a = ['co32','co36']
      b = [u'co32',u'co36']
      

      如果你检查set(a)==set(b),它将是False,但如果你这样做:

      b = str(b)
      set(a)==set(b)
      

      现在,结果将是 True。

      【讨论】:

      • 危险,危险。在不传递编码的情况下,您永远不应该对 Unicode(str()u'€'.encode())进行编码。如果字符串包含非 ASCII,用户将收到 UnicodeEncodeException。
      • 此外,您的代码不起作用。 b = str(b) 只是给出列表的字符串repr(),即b = "[u'co32', u'co36']"。然后set(a)==set(b) = False
      【解决方案5】:

      u'Some String' 中的 u 表示你的字符串是一个 Unicode 字符串

      问:我非常着急,从 Google 搜索来到这里。我正在尝试将此数据写入文件,但出现错误,此时我需要最简单但可能有缺陷的解决方案。

      A:你真的应该阅读 Joel 的 Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) 关于字符集的文章。

      问:请不要有时间码

      答:好的。试试str('Some String')'Some String'.encode('ascii', 'ignore')。但是您真的应该阅读一些关于Converting a Unicode stringthis 的答案和讨论,非常好,非常好,字符编码入门。

      【讨论】:

      • 如果字符串包含 ASCII 文本,此方法有效。在所有其他情况下,您必须显式编码。
      • 这会将 u'' 视为“要摆脱”的东西。这告诉我,您实际上并不了解它是什么。您通常不只是想“摆脱”它,从 Unicode 字符串生成字节字符串的正确方法取决于该字符串包含的内容和上下文。
      • @LennartRegebro 完全同意 - 这是一个一次性的答案,本来是开玩笑的,但它积累了令人震惊的点赞数。编辑以试图引导人们朝着正确的方向前进。
      • 读起来很有趣!谢谢!文章已有 17 年历史,仍然准确。哇。
      【解决方案6】:

      所有用于人类的字符串都应使用 u""。

      我发现以下思维方式在处理 Python 字符串时有很大帮助:所有 Python 清单字符串应使用 u"" 语法。 "" 语法仅适用于字节数组。

      在抨击开始之前,让我解释一下。大多数 Python 程序都是从使用 "" 开始的。但是随后他们需要支持 Internet 上的文档,因此他们开始使用 "".decode 并且突然之间,他们到处都在解码这个和那个 - 这一切都是因为使用 "" 来处理字符串。在这种情况下,Unicode 确实像病毒一样,会造成严重破坏。

      但是,如果你遵循我的规则,你就不会感染这种病毒(因为你已经被感染了)。

      【讨论】:

      • bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
      • @KennyTM 听起来不错!只是说所有用于人类的字符串都应该使用u""
      • 如果你想在任何地方虔诚地使用 Unicode——这对于许多应用程序(但不是全部)来说是一件好事——你几乎肯定想要 Python 3.x,而不是 2.x。在 2010 年写这篇文章时可能并非如此,但在 2014 年,大多数阻止您升级到 3.x 的库或平台也会阻止您正确使用 Unicode……
      猜你喜欢
      • 2017-10-20
      • 2022-10-09
      • 2022-12-24
      • 2012-10-07
      • 2011-02-05
      • 2010-10-20
      相关资源
      最近更新 更多