簡體   English   中英

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

[英]Suppress the u'prefix indicating unicode' in python strings

有沒有辦法全局抑制python中的unicode字符串指示器? 我在應用程序中專門處理unicode,並做了很多交互式的工作。 在所有調試輸出中都顯示u'prefix'是不必要且令人討厭的。 可以關閉嗎?

您可以使用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

..但是不要那樣做,太可怕了

我遇到了需要刪除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中是默認設置。

盡管它不會更改會引起誤解的repr(unicode_string) ,但它允許在源代碼中省略u''前綴。

您可以在Python REPL中覆蓋sys.displayhook() ,以顯示您喜歡的對象。 您也可以為自己的自定義對象覆蓋__repr__

實際上,無論何時無法100%確定python的默認編碼和字符串的確切內容,使用str( text )都是一個不好的主意-對於從互聯網上獲取的文本,后者通常是很典型的。 另外,根據您要執行的操作,使用print text.encode( 'utf-8' )print repr( text.encode( 'utf-8' ) )可能會產生令人失望的結果,因為您可能會得到無法讀取的代碼點,例如\\x3a

我認為最佳選擇實際上是利用具有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]) ,您就很好了。

不確定unicode,但通常可以調用str.encode()將其轉換為更合適的形式。 例如,在Python 3.0+中捕獲的子進程輸出將其捕獲為字節流(前綴'b'),然后encode()修復為常規字符串形式。

嘗試以下

打印str(result.url)

可能是您的默認編碼已更改。

您可以使用以下方法檢查默認編碼:

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

默認值應為ascii,這意味着u'string'應該打印為'string',但是您的可能已被修改。

您必須使用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:];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM