2010-03-17 38 views
133

像:什麼是Python字符串中的u前綴?

u'Hello' 

我的猜測是,它表示「統一」,是正確的嗎?

如果是這樣,從什麼時候可用?

+33

@美國洛特,那麼並不總是容易被發現在確切的頁面和行中的引用,特別是當你是某種語言的新手。在這裏問我更容易,更快。 (見:http://meta.stackexchange.com/questions/16353/stackoverflow-for-the-lazy-newbie-developer)順便說一句,谷歌索引這個線程有多快,現在是第三個結果:http: //www.google.com/search?q=u+prefix+on+python – OscarRyz 2010-03-17 19:02:57

+1

@Oscar雷耶斯:我很抱歉,但語言參考*必須*是您的第一,最後和唯一的這種事情。否則,你會陷入永久的n00b模式。牢牢掌握語言參考手冊,以便通過n00b個問題並開始爲人們解決實際問題非常重要。 – 2010-03-17 19:13:28

+1

@ S.Lott:你說得對。 **現在**我知道那裏的語言參考:) – OscarRyz 2010-03-17 19:29:23

回答

35

我的猜測是它表示「Unicode」,它是正確的嗎?

是的。

如果是這樣,從什麼時候可用?

Python 2.x.

(在Python 3.x中的字符串使用Unicode默認情況下,有沒有必要爲u前綴)。

+3

+1對於3.x備忘謝謝 – OscarRyz 2010-03-17 18:47:29

+4

它甚至在Python 3中使用'u'前綴的語法錯誤。 – 2010-03-17 18:53:28

+11

@TimPietzcker:只在3.0-3.2;在3.3+以上是合法的(也沒有意義),以便編寫2.6 +/3.3 +單一代碼庫庫和應用程序。 – abarnert 2014-09-11 23:59:59

1

所有用於人類的字符串都應該使用u」「。

我發現下面的心態有很大幫助,在使用Python字符串處理時:所有 Python的清單字符串應該使用u""語法。 ""語法僅適用於字節數組。

在撲開始之前,讓我解釋一下。大多數Python程序首先使用""作爲字符串。但之後他們需要支持Internet上的文檔,因此他們開始使用"".decode,並且突然間他們在解碼這個和所有內容時都會遇到異常情況 - 所有這一切都是因爲使用了字符串""。在這種情況下,Unicode確實會像病毒一樣行爲並會造成嚴重破壞。但是,如果你按照我的規則,你將不會有這種感染(因爲你已經被感染)。

+0

'bash -c「echo你不應該使用b \\」... \\\「作爲字節數組嗎?」' – kennytm 2010-03-17 19:06:47

+0

@KennyTM聽起來不錯!簡單地說,所有用於人類的字符串都應該使用「u」「'。 – 2010-03-17 19:38:12

+0

如果你想虔誠地在任何地方使用Unicode,對於許多應用程序(但不是全部),這是一件好事 - 你幾乎肯定希望Python 3.x,而不是2.x.這在2010年可能並非如此,但在2014年,大多數阻止您升級到3.x的庫或平臺也將阻止您正確使用Unicode ... – abarnert 2014-09-12 00:01:43

91

您在u'Some String'中的u表示您的字符串是一個Unicode字符串

問:我處於一種可怕的,可怕的匆忙狀態,我從Google搜索登陸。我試圖將這些數據寫入一個文件,我得到一個錯誤,而且我需要最簡單的,可能有缺陷的解決方案。

答:你應該真的閱讀喬爾的Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)關於字符集的散文。

問:SRY沒有時間碼請

A:很好。請嘗試str('Some String')'Some String'.encode('ascii', 'ignore')。但你應該真的閱讀一些關於Converting a Unicode stringthis的優秀,優秀的關於字符編碼的入門書。

+6

如果字符串僅包含* ASCII文本*。在所有其他情況下,您必須明確編碼。 – 2014-09-13 13:55:01

+2

這把u''視爲「擺脫」的東西。這告訴我你並沒有真正理解它是什麼。您通常不只是想「擺脫」它,並且從Unicode字符串中生成字節字符串的正確方法取決於該字符串包含的內容以及在哪個上下文中。 – 2014-12-09 12:32:49

+1

@LennartRegebro完全同意 - 這是一個只是口齒不清的答案,但它積累了一些驚人的upvotes。編輯試圖引導人們朝着正確的方向發展。 – Andrew 2015-02-05 22:28:23

1

它是Unicode。

只要把變量str()之間,它會正常工作。

,但如果你有兩個列表如下所示:

a = ['co32','co36'] 
b = [u'co32',u'co36'] 

如果檢查set(a)==set(b),它會爲假,但如果這樣做如下:

b = str(b) 
set(a)==set(b) 

現在,結果將是真實的。

+0

危險,危險。你不應該編碼一個Unicode('str()'或'u'€'.encode()')。如果字符串包含非ASCII,則用戶將收到UnicodeEncodeException。 – 2016-12-26 17:21:37

+0

此外,您的代碼不起作用。 'b = str(b)'只給出列表的字符串'repr()',即'b =「[u'co32',u'co36']」'。然後'set(a)== set(b)= False' – 2016-12-26 17:23:46

0

我來到這裏是因爲我的requests輸出上有搞笑字符綜合症。我認爲response.text會給我一個正確解碼的字符串,但在輸出中,我發現有趣的雙字符德國變音本應該是。

原來response.encoding是空的,所以響應不知道如何正確解碼內容,只是把它當作ASCII(我猜)。

我的解決方案是用'response.content'獲取原始字節並手動將decode('utf_8')應用於它。結果是schöneUmlaute。

的正確解碼

獻給

與未正確解碼

fĂźr

相關問題