禁止在python字符串中指示unicode的u'prefix

Rya*_*yan 48 python printing string unicode

有没有办法在python中全局抑制unicode字符串指示符?我在应用程序中专门使用unicode,并做了很多交互式的东西.将u'prefix'显示在我的所有调试输出中是不必要和令人讨厌的.可以关掉吗?

dbr*_*dbr 40

您可以使用Python 3.0 ..默认字符串类型是unicode,因此u''不再需要前缀..

简而言之,没有.你无法关闭它.

所述u来源于unicode.__repr__方法,它是用来在REPL显示的东西:

>>> print repr(unicode('a'))
u'a'
>>> unicode('a')
u'a'
Run Code Online (Sandbox Code Playgroud)

如果我没有弄错,你不能在不重新编译Python的情况下覆盖它.

最简单的方法是简单地打印字符串..

>>> print unicode('a')
a
Run Code Online (Sandbox Code Playgroud)

如果你使用unicode()内置来构造你的所有字符串,你可以做类似的事情.

>>> class unicode(unicode):
...     def __repr__(self):
...             return __builtins__.unicode.__repr__(self).lstrip("u")
... 
>>> unicode('a')
a
Run Code Online (Sandbox Code Playgroud)

但是不要这样做,这太可怕了

  • 这是一个很好的解决方案.真正的答案是吸吮它! (6认同)
  • 对我来说+1学习python 3字符串默认都是unicode (6认同)

Pau*_*ipp 30

我有一个案例,我需要删除你的前缀因为我正在设置一些javascript与python作为HTML模板的一部分.一个简单的输出将u前缀保留为dict键,例如

var turns = [{u'armies':2...];
Run Code Online (Sandbox Code Playgroud)

打破了javascript.

为了获得所需的输出javascript,我使用json python模块为我编码字符串:

turns = json.dumps(turns)
Run Code Online (Sandbox Code Playgroud)

这在我的特定情况下起作用,因为键都是ascii,所以不用担心编码.您可以将此技巧用于调试输出.

  • 出色的json.dumps()像repr()一样是“递归的”。一个警告,“字典键”从int转换为str。`assert'{“ 3”:5}'== json.dumps({3:5})`(因为JavaScript对象属性[identifiers](http://stackoverflow.com/a/3633685/673991)都是字符串) (2认同)

jfs*_*jfs 8

from __future__ import unicode_literals
Run Code Online (Sandbox Code Playgroud)

从Python 2.6(2008年10月1日发布)开始提供.它是Python 3中的默认值.

它允许u''在源代码中省略前缀,尽管它不会改变repr(unicode_string)会产生误导.

您可以sys.displayhook()在Python REPL中覆盖,以显示您喜欢的对象.您也可以覆盖__repr__自己的自定义对象.


flo*_*low 7

str( text )实际上,当你无法100%确定python的默认编码和字符串的确切内容时,使用是一个有点糟糕的想法 - 后者对于从互联网上获取的文本来说是典型的.另外,根据你想要做什么,使用print text.encode( 'utf-8' )或者print repr( text.encode( 'utf-8' ) )可能会产生令人失望的结果,因为你可能会得到一个充满了不可读代码点的渲染\x3a.

我认为最好的方法是利用一个支持unicode的命令行(在windows下很难,在Linux下很容易)并从python 2.x切换到python 3.x. 新的python 3系列提供的文本与字节处理的简易性和清晰度实际上是您可以期待的最大收益之一.它确实意味着你将花费一点时间来学习"字节"和"文本"之间的区别并掌握字符编码的概念,但那时候在python 3环境中花费的时间要好得多,就像python的新方法一样令人烦恼的问题比python 2提供的更清晰,更容易出错.我想回想起python 2的方法来解决unicode问题,虽然我曾经认为它是优越的---当我将它与php中处理这个问题方式进行比较时.

编辑我刚刚在这里关于SO 的相关讨论停止了,发现这条评论关于这些天来解决unicode /编码问题的方式:

它就像一只试图吃大象的老鼠.通过将Unicode构建为ASCII的扩展(我们有普通字符串并且我们有mb_strings),它会以错误的方式解决问题,并且需要处理需要多个字节的有趣曲线所需的特殊情况.如果您将Unicode视为为您需要的任何字符提供抽象空间,则可以使用ASCII,而无需将其视为特殊情况.

我在这里引用这个是因为根据我的经验,所有SO python + unicode主题的90%似乎来自那些过去常常使用ascii或者latin-1的人,被他们通常设置中不支持的偶然角色所咬,然后基本上只是想摆脱它.切换到python 3时你所做的正是上面的评论者建议做的事情:你不再将unicode视为ascii的一个令人烦恼的扩展,而是开始查看ascii(以及几乎你将遇到的任何其他编码)作为子集(s )unicode.

确实如此,unicode v6当然不是编码中的最后一个词,但它与2011年可以获得的通用性一样接近.习惯它.


tau*_*ogy 6

似乎对我有用的是:

import ast
import json
j = json.loads('{"one" : "two"}')
j
dd = {u'one': u'two'}
dd
# to get double quotes
json.dumps(j,  encoding='ascii')
json.dumps(dd, encoding='ascii')
# to get single quotes
str(ast.literal_eval(json.dumps(j,  encoding='ascii')))
str(ast.literal_eval(json.dumps(dd, encoding='ascii')))
Run Code Online (Sandbox Code Playgroud)

输出:

>>> {u'one': u'two'}
>>> {u'one': u'two'}
>>> '{"one": "two"}'
>>> '{"one": "two"}'
>>> "{'one': 'two'}"
>>> "{'one': 'two'}"
Run Code Online (Sandbox Code Playgroud)

不言而喻,以上内容适用于字典和JSON对象。

对于一个字符串,包裹在str()中似乎对我有用。

s=u'test string'
s
str(s)
Run Code Online (Sandbox Code Playgroud)

输出:

>>> u'test string'
>>> 'test string'
Run Code Online (Sandbox Code Playgroud)

Python版本:2.7.12


小智 5

我知道这不是一个全局选项,但您也可以通过将字符串放入 str() 函数来抑制 Unicode u。

因此,Unicode 派生列表如下所示:

>>> myList=[unicode('a'),unicode('b'),unicode('c')]
>>> myList
[u'a', u'b', u'c']
Run Code Online (Sandbox Code Playgroud)

会变成这样:

>>> myList=[str(unicode('a')),str(unicode('b')),str(unicode('c'))]
>>> myList
['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

这有点麻烦,但可能对某些人有用

  • 呃,绝对**不要这样做**——它会因非 ASCII 数据而崩溃,并且从一开始就违背了使用 unicode 的全部目的。如果你依赖于某个地方没有“u”,那么你就犯了一些可怕的错误。@itsricky,您可能想要编码为 JSON,而不是尝试在 PHP 中解析 Python repr! (4认同)