![](/img/trans.png)
[英]Python unicode string literals :: what's the difference between '\u0391' and u'\u0391'
[英]What is the difference between u' ' prefix and unicode() in python?
你u''
前綴和unicode()
什么區別?
# -*- coding: utf-8 -*-
print u'上午' # this works
print unicode('上午', errors='ignore') # this works but print out nothing
print unicode('上午') # error
對於第三個print
,錯誤顯示:UnicodeDecodeError:'ascii'編解碼器無法解碼位置0中的字節0xe4
如果我有一個包含非ascii字符的文本文件,例如“上午”,如何閱讀並正確打印出來?
u'..'
是一個字符串文字,並根據源編碼聲明解碼字符。
unicode()
是一個將另一個類型轉換為unicode
對象的函數,你給它一個字節字符串文字 。 它將根據默認的ASCII編解碼器解碼字節字符串。
因此,您使用不同類型的文字表示法創建了一個字節字符串對象,然后嘗試將其轉換為unicode()
對象,該對象失敗,因為str
- > unicode
轉換的默認編解碼器是ASCII。
這兩個是完全不同的野獸。 如果你想使用后者,你需要給它一個明確的編解碼器:
print unicode('上午', 'utf8')
這兩者的相關性與使用0xFF
和int('0xFF', 0)
相關的方式相同; 前者使用十六進制表示法定義值255的整數,后者使用int()
函數從字符串中提取整數。
另一種方法是使用str.decode()
方法 :
print '上午'.decode('utf8')
除非你知道自己在做什么,否則不要試圖使用錯誤處理程序(例如ignore'
或'replace'
)。 'ignore'
尤其可以掩蓋選擇錯誤編解碼器的潛在問題。
您可能想要閱讀Python和Unicode:
Ned Batchelder的實用Unicode
絕對最低每個軟件開發人員絕對必須知道關於Unicode和字符集(沒有任何借口!)作者:Joel Spolsky
當str
在Python 2.7.x
沒有以u''
為前綴時,解釋器看到的是一個字節字符串,沒有顯式編碼。
如果您沒有告訴解釋器在執行unicode()
時如何處理這些字節,它將(如您所見)默認嘗試通過ascii編碼方案decode
它看到的字節。
它是嘗試將str
的普通字節轉換為unicode
對象的初步步驟。
使用ascii
進行decode
意味着:嘗試使用硬編碼映射( 0
到127
之間的數字)來解釋str
每個字節。
您遇到的錯誤就像一個dict
KeyError
:解釋器遇到一個ascii
編碼方案沒有指定映射的字節。
由於解釋器不知道如何處理字節,因此會拋出錯誤。
您可以通過告訴解釋器使用另一組編碼/解碼映射來decode
字節來改變該初步步驟,而不是ascii,例如UTF-8
,如其他答案中詳細說明的那樣。
如果解釋器在str
中的每個字節(或字節)中找到所選方案中的映射,則它將成功解碼,並且解釋器將使用生成的映射來生成unicode
對象。
Python unicode
對象是一系列Unicode 代碼點 。 Unicode 代碼空間中有1,112,064個有效代碼點。
如果您選擇用於解碼的方案是您的文本(或代碼點)編碼的方案,則打印時的輸出應與原始文本相同。
也可以考慮嘗試Python 3
。 相關的差異在下面的第一條評論中解釋。
Unicode是一種對象類型,而“u”是用於表示該對象是unicode對象的文字。 它類似於用於表示long int的'L'文字。
請嘗試:'上午'.decode('utf8','ignore')。encode('utf8')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.