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

时间:2009-04-17 17:22:05

标签: python string unicode printing

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

11 个答案:

答案 0 :(得分:40)

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

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

u来自unicode.__repr__方法,该方法用于在REPL中显示内容:

>>> print repr(unicode('a'))
u'a'
>>> unicode('a')
u'a'

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

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

>>> print unicode('a')
a

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

>>> class unicode(unicode):
...     def __repr__(self):
...             return __builtins__.unicode.__repr__(self).lstrip("u")
... 
>>> unicode('a')
a

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

答案 1 :(得分:27)

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

var turns = [{u'armies':2...];

打破了javascript。

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

turns = json.dumps(turns)

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

答案 2 :(得分:8)

from __future__ import unicode_literals

自Python 2.6(2008年10月1日发布)起可用。它在Python 3中是默认的。

它允许在源代码中省略u''前缀,但它不会改变会引起误导的repr(unicode_string)

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

答案 3 :(得分: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问题,尽管我曾经认为它更优越 - 当我将它与way this issue is handled in php进行比较时。

编辑我刚刚在a related discussion停留在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年的通用性一样接近普及。习惯它。

答案 4 :(得分:4)

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

所以Unicode派生列表如下所示:

>>> myList=[unicode('a'),unicode('b'),unicode('c')]
>>> myList
[u'a', u'b', u'c']

会变成这样:

>>> myList=[str(unicode('a')),str(unicode('b')),str(unicode('c'))]
>>> myList
['a', 'b', 'c']

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

答案 5 :(得分:4)

如果您得到类似u['hello']的内容,那么您必须打印一个数组。打印str(arr[0]),你很高兴。

答案 6 :(得分:3)

不确定使用unicode,但通常可以调用str.encode()将其转换为更合适的形式。例如,在Python 3.0+中捕获的子进程输出将其捕获为字节流(前缀“b”),并将encode()修复为常规字符串形式。

答案 7 :(得分:3)

似乎对我有用:

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')))

输出:

>>> {u'one': u'two'}
>>> {u'one': u'two'}
>>> '{"one": "two"}'
>>> '{"one": "two"}'
>>> "{'one': 'two'}"
>>> "{'one': 'two'}"

以上适用于字典和JSON对象,这是不言而喻的。

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

s=u'test string'
s
str(s)

输出:

>>> u'test string'
>>> 'test string'

Python版本:2.7.12

答案 8 :(得分:1)

尝试以下

  

print str(result.url)

可能是您的默认编码已更改。

您可以使用以下方法检查默认编码: -

> import sys
> print sys.getdefaultencoding()
> ascii

默认值应为ascii,这意味着你的字符串'应该打印为'string',但你的字符串可能已被修改。

答案 9 :(得分:1)

您必须使用print str(your_Variable)

答案 10 :(得分:1)

如果您不想更新到Python 3,则可以使用子字符串。 例如,假设原始输出是(u'mystring',)。让我们假设为了示例,变量行包含没有unicode前缀的“mystring”字符串。然后你会想做这样的事情:

temp = str(row); #str is not necessary, but probably good practice
temp = temp[:-3];
print = temp[3:];