2015-05-19 124 views
0

讓我們舉一個簡單的變量 -Python中的Unicode編碼解碼問題

var = u' \u2013 2' 

讓我們嘗試對其進行解碼 -

var.decode('utf-8') 

我碰到下面的錯誤 -

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 7: ordinal not in range(128) 

讓我們嘗試對其進行編碼 -

var.encode('utf-8') 

我碰到下面的錯誤 -

'ascii' codec can't decode byte 0xe2 in position 8: ordinal not in range(128) 

一種解決方法是做 -

sys.setdefaultencoding('utf-8') 

讓我知道,別人在做什麼?

+0

你在哪裏運行? –

+0

你只是不明白'unicode'和'bytes'的區別。然而,Python 27並沒有設法讓它正確:unicode對象有一個'.decode'方法,並且bytestrings有一個'.encode',這是一個無意義的。 – bgusach

回答

2

讓我們嘗試解碼[Unicode字符串]

解碼字節爲Unicode。您將編碼爲 Unicode轉換爲字節。

您無法解碼unicode字符串。

如果您嘗試,Python會自動將Unicode字符串轉換爲可解碼的字符串來幫助您:字節字符串。由於這是隱含的,它使用您的平臺的默認編碼,即ASCII。 ASCII碼不能編碼U + 2013,所以你有錯誤。

(事後看來,這一嘗試在「做什麼我的意思」的行爲是錯誤的。Python 3裏不再允許它。)

我得到「ASCII」編解碼器不能解碼位置字節0xe2 8:在範圍序數不(128)

你正在做別的事情,你有沒有告訴我們,然後,因爲編碼工作正常:

>>> u' \u2013 2'.encode('utf-8') 
' \xe2\x80\x93 2' 

一種解決方案是做sys.setdefaultencoding函數(「UTF-8」)

這是從來沒有一個妥善解決事情,這是爲什麼Python中需要一些措施來阻止你這樣做。

0

聲明

>>> var = u' \u2013 2' 

創建你的程序中Unicode字符串對象。你似乎犯的錯誤是假設Unicode對象是編碼的:它們不是,它們的形式適合Python代碼直接使用。

當您想要傳輸Unicode字符串時,必須將其作爲字節序列來執行,這意味着您的字符串必須是編碼的

>>> var.encode("utf-8") 

給出結果

' \xe2\x80\x93 2' 

這的確是你在UTF-8編碼的原始字符串。你可以用

>>> var.encode('utf-8').decode('utf-8') 

,讓你回到原來的Unicode字符串驗證這一點:

u' \u2013 2' 

記住 - 解碼的方式(外部表示轉換成Unicode的對象),編碼上出路(所以你的Unicode對象可以表示爲字節串)。