禁止在Pythonstring中指示unicode的u'prefix

有没有办法在Python中全局禁止unicodestring指示符? 我在一个应用程序专门与unicode工作,并做了很多互动的东西。 让u'prefix'出现在我的所有debugging输出中是不必要的和令人厌恶的。 它可以被closures吗?

你可以使用Python 3.0 ..默认的stringtypes是unicode,所以u''前缀不再需要..

总之,没有。 你不能关掉这个。

u来自unicode.__repr__方法,用来在REPL中显示东西:

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

如果我没有弄错,你不能重写这个,而不重新编译Python。

最简单的方法是简单地打印string..

 >>> print unicode('a') a 

如果你使用unicode()内build来构build你所有的string,你可以做类似的事情。

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

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

我有一个情况下,我需要删除u前缀,因为我设置了一些JavaScript与Python作为一个HTML模板的一部分。 例如,一个简单的输出留下的字母键的前缀

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

这打破了JavaScript。

为了得到所需的输出javascript,我使用了json python模块来为我编码string:

 turns = json.dumps(turns) 

这在我的特定情况下是诀窍,因为所有的密钥都是ascii,所以不用担心编码。 你可能可以使用这个技巧来进行debugging输出。

使用str( text )实际上是一个有点坏主意,当你不能100%确定你的Python的默认编码和string的确切内容—后者将是从互联网上获取文本的典型。 另外,根据你想要做什么,使用print text.encode( 'utf-8' )print repr( text.encode( 'utf-8' ) )可能会产生令人失望的结果,因为你可能会得到一个充满像\x3a这样不可读的代码点。

我认为最好的是真正利用unicodefunction的命令行(在Windows下很容易,在linux下),并从python 2.x切换到python 3.x. 新的python 3系列提供的文本vs字节处理的简易性和清晰度确实是你可以期待的巨大收益之一。 这意味着你将不得不花费一些时间来学习“字节”和“文本”之间的区别,并掌握字符编码的概念,但是那时候在python 3环境中花费的时间会更多,因为python的新的接近令人烦恼的问题比python 2所提供的更为清晰,也更不容易出错。 我甚至会调用python 2的方法来unicode问题的回顾,虽然我曾经认为它是优越的—当我比较它的方式这个问题在PHP中处理 。

编辑我刚才停止了在这里的相关讨论 ,所以发现这个评论的方式,这些天似乎解决unicode /编码问题的PHP:

这就像一只试图吃大象的老鼠。 通过将Unicode作为ASCII的扩展(我们有正常的string,我们有mb_strings),把事情弄错了,并挂上了什么特殊的情况下需要处理与需要多于一个字节的有趣的歪曲字符。 如果您将Unicode视为为您需要的任何字符提供抽象空间,那么ASCII将被容纳在其中,而不需要将其视为特殊情况。

我在这里引用这个,因为根据我的经验,所有SO Python + unicode主题中的90%似乎来自曾经习惯于ascii或latin-1的人,偶尔被不常用的设置支持的字符咬伤,然后基本上只是想摆脱它。 切换到python 3时所做的事情正是上面提到的评论者所做的:不是将unicode看作是ascii的一个令人烦恼的扩展,而是开始将ascii(以及几乎任何其他的编码,你将遇到)作为子集)的unicode。

unicode v6当然不是编码中的最后一个字,但它已经接近于2011年的普及程度。习惯它。

我知道这不是一个全局选项,但你也可以通过将string放在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'] 

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

不知道与Unicode,但通常你可以调用str.encode()将其转换为更适合的forms。 例如,在Python 3.0 +中捕获的子stream程输出将其捕获为字节stream(前缀“b”),并将encode()修复为常规stringforms。

 from __future__ import unicode_literals 

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

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

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

以防万一你得到了这样的东西,你必须打印一个数组。 print str(arr[0]) ,你很好。

什么似乎为我工作:

 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对象的作品,不言而喻。

对于只是一个string,包装在str()似乎为我工作。

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

输出:

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

Python版本:2.7.12

尝试以下

print str(result.url)

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

您可以使用以下方式检查您的默认编码: –

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

默认值应该是ascii这意味着u'string'应该被打印为'string',但是你的可能已经被修改了。

你必须使用print str(your_Variable)

如果你不想更新到Python 3,你可以使用子string。 例如,假设原始输出是(u'mystring',)。 让我们假设为了这个例子,variables行包含没有unicode前缀的“mystring”string。 那么你会想要做这样的事情:

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