有没有办法全局抑制 python 中的unicode字符串指示器? 我在应用程序中专门处理unicode,并做了很多交互式的工作。 在所有调试输出中都显示u'prefix'是不必要且令人讨厌的。 可以关闭吗?
您可以使用Python 3.0。默认字符串类型为unicode,因此不再需要unicode()前缀。
unicode()
简而言之,没有。 您无法关闭此功能。
unicode()来自unicode.__repr__方法,该方法用于显示REPL中的内容:
unicode.__repr__
>>> 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
..但是不要那样做,太可怕了
我遇到了需要删除u前缀的情况,因为我使用python模板将一些javascript设置为html模板。 一个简单的输出为字典键保留了u前缀,例如
var turns = [{u'armies':2...];
这打破了JavaScript。
为了获得所需的输出javascript,我使用json python模块为我编码了字符串:
turns = json.dumps(turns)
在我的特定情况下,这可以解决问题,并且由于键都是ascii,因此无需担心编码。 您可能会将此技巧用于调试输出。
from __future__ import unicode_literals
自python 2.6(2008年10月1日发布)以来可用。 在Python 3中是默认设置。
它允许在源代码中省略sys.displayhook()前缀,尽管它不会更改__repr__,这会引起误解。
sys.displayhook()
__repr__
您可以在Python REPL中覆盖sys.displayhook(),以显示您喜欢的对象。 您也可以为自己的自定义对象覆盖__repr__。
实际上,每当您不能同时100%地确定python的默认编码和字符串的确切内容时,使用str( text )就是一个不好的主意-从互联网上获取的文本通常使用后者。 此外,根据您要执行的操作,使用print text.encode( 'utf-8' )或print repr( text.encode( 'utf-8' ) )可能会产生令人失望的结果,因为您可能会得到诸如2755980938986390590531之类的无法读取的代码点。
str( text )
print text.encode( 'utf-8' )
print repr( text.encode( 'utf-8' ) )
我认为最佳选择实际上是利用具有unicode功能的命令行(在Windows下困难,在Linux下容易)并从python 2.x切换到python3.x。 新的python 3系列所提供的文本与字节处理的简单明了,确实是您可以期待的一大收获。 这的确意味着您将不得不花一些时间来学习“字节”和“文本”之间的区别,并掌握字符编码的概念,但是那样的话,在python 3环境中花费的时间要多得多,因为python可以解决这些问题 令人烦恼的问题比python 2所提供的要清晰得多,并且不容易出错。 回想起来,我什至可以称呼python 2解决unicode问题的方法,尽管我曾经认为它是高级的,当我将它与php中解决此问题的方式进行比较时。
编辑我只是在这里进行了相关讨论,因此就这几天php似乎解决unicode / encoding问题的方式发现了此评论:
就像老鼠想吃东西一样 象。 通过将Unicode框架为 ASCII扩展名(我们有正常 字符串,我们有mb_strings) 以错误的方式解决问题,并且 挂在什么特殊情况上 需要处理字符 需要更多的有趣花体 一个字节。 如果您将Unicode视为 为任何人提供抽象空间 您需要的字符,ASCII是 无需任何住宿 将其视为特例。
我在这里引用这是因为,根据我的经验,所有SO python + unicode主题中的90%似乎来自那些过去对ascii或latin-1都比较满意的人,被那些通常情况下不支持的偶尔性格所咬, 然后基本上只是想摆脱它。 切换到python 3时的操作恰恰是上面的注释者建议的操作:您不再将unicode视为ascii的令人讨厌的扩展,而是开始将ascii(以及几乎所有您将遇到的其他编码)视为子集。 )。
确实,unicode v6当然不是编码中的硬道理,但它几乎像2011年一样具有通用性。要习惯它。
似乎对我有用的是:
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
我知道这不是一个全局选项,但是您也可以通过将字符串放在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']
这有点麻烦,但可能对某些人有用
万一您收到类似u['hello']的内容,则必须打印一个数组。 打印str(arr[0]),您一切顺利。
u['hello']
str(arr[0])
不确定unicode,但通常您可以致电str.encode()将其转换为更合适的形式。 例如,在Python 3.0+中捕获的子进程输出将其捕获为字节流(前缀'b'),然后encode()修复为常规字符串形式。
str.encode()
尝试以下
打印str(result.url)
可能是您的默认编码已更改。
您可以使用以下方法检查默认编码:-
> import sys > print sys.getdefaultencoding() > ascii
默认值应为ascii,这意味着u'string'应该打印为'string',但是您的可能已被修改。
您必须使用print str(your_Variable)
print str(your_Variable)
如果您不想更新到Python 3,则可以使用子字符串。例如,假设原始输出为(u'mystring',)。 为了示例起见,我们假设变量行包含不带unicode前缀的“ mystring”字符串。 然后,您需要执行以下操作:
temp = str(row); #str is not necessary, but probably good practice temp = temp[:-3]; print = temp[3:];