Python字符串中的u前缀是什么?


Answers:


147

您说得对,请参阅3.1.3。Unicode字符串

自Python 2.0以来就是语法。

Python 3使它们多余,因为默认的字符串类型是Unicode。从3.0到3.2版本删除了它们,但是在3.3+重新添加了它们,以便与Python 2兼容,以辅助2到3过渡。


6
应该补充一点,它在Python 3中不再是必需的,但是仍然是有效的语法。
马丁·托马

结合统一+ RAW(正则表达式)字符串(例如ur"string")在Python 2有效的,但它是在Python 3遗憾的是无效的语法
cowlinator

123

u in u'Some String'表示您的字符串是Unicode字符串

问:我很着急,很可怕,我从Google搜索登陆了。我正在尝试将此数据写入文件,但出现错误,并且此刻我需要最简单的,可能有缺陷的解决方案。

答:您应该真正阅读Joel的“ 绝对最低要求”,每个软件开发人员绝对,肯定必须了解有关字符集的Unicode和字符集(无借口!)文章。

问:请不要输入时间码

A:很好。尝试str('Some String')'Some String'.encode('ascii', 'ignore')。但是,你真的应该读一些答案和讨论上转换Unicode字符串这个优秀,卓越,底漆上的字符编码。


6
如果字符串包含ASCII文本,则此方法有效。在所有其他情况下,您都必须显式编码。
马丁·彼得

2
这将u''视为“摆脱”。这告诉我您实际上并不了解它是什么。通常,您不只是想要“摆脱”它,而且从Unicode字符串中生成字节字符串的正确方法取决于该字符串包含的内容以及在何种上下文中使用。
Lennart Regebro 2014年

2
@LennartRegebro完全同意-这是一个简单易用的答案,本来可以说是面面俱到,但是却累积了令人恐怖的数目。编辑试图引导人们朝正确的方向发展。
安德鲁

1
读起来真有趣!谢谢!文章已有17年历史,并且仍然准确。哇。
Kerwin Sneijders

52

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

是。

如果可以,那么什么时候可用?

Python2.x。

在Python 3.x中,默认情况下,字符串使用Unicode,并且不需要u前缀。注意:在Python 3.0-3.2中,u是语法错误。在Python 3.3以上版本中,再次简化编写2/3兼容应用程序是合法的。


4
使用u前缀甚至是Python 3中的语法错误。
Tim Pietzcker 2010年

14
@TimPietzcker:仅适用于3.0-3.2;在3.3+版本中,这样做是合法的(而且毫无意义),这使得编写2.6 + / 3.3 +单个代码库和应用程序变得更加容易。
abarnert 2014年

@abarnert:好了,这个评论现在已经有四年半了:)
Tim Pietzcker 2014年

3
@TimPietzcker:当然,但是对于您在2010年通过搜索找到此有用答案的任何人来说,您的评论都是有用的附录,我认为将3.3的更改与2014年发现它的任何人都提到是有用的。答案,但是我认为这是大多数人不会遇到的次要问题(因为除非您在2014年仍使用3.0-3.2,否则您只需知道“不需要前缀”即可)。
abarnert 2014年

如果您要编写代码供任意用户下载和运行,并且希望在不做任何假设的情况下涵盖大多数情况,那么知道3.0-3.2会崩溃将很有帮助。因为您需要确定是否愿意在six.text_type()各处使用仍希望使用3的(希望是微不足道的)人数。[012] -至少信息在那里,您可以选择。
dwanderson

3

我来这里是因为我的requests输出中有滑稽字符综合症。我以为response.text会给我一个正确解码的字符串,但是在输出中我发现了有趣的双字符,应该是德国变音符。

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

我的解决方案是使用“ response.content”获取原始字节并手动对其应用decode('utf_8')。结果是舍恩·乌姆劳特(schöneUmlaute)。

正确解码

毛皮

与不正确解码

Ăź


2

供人类使用的所有字符串都应使用u“”。

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

在扑打开始之前,让我解释一下。大多数Python程序开始于使用"" for字符串。但是随后他们需要从Internet上支持文档,因此他们开始使用它"".decode,突然之间,到处都有关于解码该内容的异常-都是由于使用""了字符串。在这种情况下,Unicode的确像病毒一样,将造成严重破坏。

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


bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
kennytm 2010年

@KennyTM听起来不错!简单地说,所有用于人类的字符串都应该使用u""
Frank Krueger 2010年

1
如果您想在所有地方都忠实地使用Unicode(对于许多应用程序(但不是全部)而言,这是一件好事),则几乎可以肯定需要Python 3.x,而不是2.x。在撰写本文时,2010年可能并非如此,但是在2014年,大多数阻止您升级到3.x的库或平台也将阻止您正确使用Unicode…
abarnert 2014年

1

它是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。
Alastair McCormack

3
此外,您的代码不起作用。b = str(b)仅给出repr()列表的字符串,即b = "[u'co32', u'co36']"。然后set(a)==set(b) = False
Alastair McCormack
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.