2012-02-01 45 views
5

如果我有unicode字符串名單 <pre><code>lst = [ u"aaa", u"bbb", u"foo", u"bar", ... u"baz", u"zzz" ] </code></pre> <p>是有必要寫每個字符串之前的前綴<code>u</code>?我可以做一個構造,說lst的每個元素都是unicode字符串,然後在沒有<code>u</code>前綴的情況下編寫它?</p>

列表的
+0

這取決於你使用Python 2或Python 3. – 2012-02-01 14:26:02

+0

我使用'的Python 2.7.2 +',但如果你知道答案兩種可能是對未來有用。 – xralf 2012-02-01 14:39:06

+0

在Python 3.x中,默認情況下所有的字符都是unicode,任何處理文本I/O(文件,數據庫,打印)的通道都需要explcit編碼或默認使用全系統編碼。 – jsbueno 2012-02-01 14:59:48

回答

14

在Python 2.7(也Python 2.6中),你可以做的Unicode文本的模塊默認:

from __future__ import unicode_literals 

您必須包括在文件的頂部導入,然後將其應用到所有文件中的字符串文字。使用b前綴強制字節串:

>>> from __future__ import unicode_literals 
>>> "sss" 
u'sss' 
>>> b"x" 
'x' 
1

如果你的意圖是一套標準的字符串轉換爲Unicode的轉換,可以說功能映射到你的列表:

lst = ["aaa", "bbb", "ccc"] 
map(unicode, lst) 

其中給出

[u"aaa", u"bbb", u"ccc"] 

然而,如果lst包含非ASCII字符串,您必須在u前加上特定的字符串。如果不這樣做,你會在轉換得到這個錯誤:

lst = ["\xe4"] 
map(unicode,lst) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) 

正如在評論中指出,這個答案就是Python 2.x或3.x的不同在Python 3中,everything changes

您認爲您瞭解二進制數據和Unicode的一切都已更改。 Python 3.0使用文本和(二進制)數據的概念,而不是Unicode字符串和8位字符串。所有的文本都是Unicode的;然而編碼的Unicode表示爲二進制數據。用於保存文本的類型是str,用於保存數據的類型是字節。與2.x情況最大的區別在於,在Python 3.0中混合文本和數據的任何嘗試都會引發TypeError,而如果您要在Python 2.x中混合使用Unicode和8位字符串,則它會在8位字符串碰巧只包含7位(ASCII)字節,但如果它包含非ASCII值,則會得到UnicodeDecodeError。多年來,這種價值特定的行爲已經造成了無數的悲傷面孔。

+0

我想只使用一些更好的聲明來節省我的打字時間。例如'lst = u [「aaa」,「bbb」,「ccc」]'這會告訴'lst'中的每個字符串都是unicode。 – xralf 2012-02-01 14:38:15

+0

-1不知道unicode編碼,並認爲「ASCII是好的」 - 請閱讀http://www.joelonsoftware.com/articles/Unicode.html – jsbueno 2012-02-01 15:01:27

+0

@jsbueno - 我沒有說過默認的Python 2。 x編碼(ASCII)是「OK」。我簡單地介紹了一種快速和骯髒的方法,用於將OP的只有ASCII編碼的列表轉換爲具有顯式ASCII編碼的unicode表示。這是他想要的嗎?我不完全確定,因爲他沒有指定他想要的編碼,所以我猜測。爲了給這個站點增加價值,如果你覺得需要關於不同編碼的詳細解釋,請在另一個答案中提供它! – Hooked 2012-02-01 15:26:44

相關問題