2011-05-01 111 views
3

我已經嘗試了不少於5種不同的「解決方案」,並且無法使用它,請幫助。如何在Google App Engine數據存儲區中存儲非ASCII字符

這是錯誤

'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128) 
    Traceback (most recent call last): 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 636, in __call__ 
    handler.post(*groups) 
    File "/base/data/home/apps/elmovieplace/1.350096827241428223/script/pftv.py", line 114, in post 
    movie.put() 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 984, in put 
    return datastore.Put(self._entity, config=config) 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 455, in Put 
    return _GetConnection().async_put(config, entities, extra_hook).get_result() 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_rpc.py", line 1219, in async_put 
    for pbs in pbsgen: 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_rpc.py", line 1070, in __generate_pb_lists 
    pb = value_to_pb(value) 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 239, in entity_to_pb 
    return entity._ToPb() 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 841, in _ToPb 
    properties = datastore_types.ToPropertyPb(name, values) 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore_types.py", line 1672, in ToPropertyPb 
    pbvalue = pack_prop(name, v, pb.mutable_value()) 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore_types.py", line 1485, in PackString 
    pbvalue.set_stringvalue(unicode(value).encode('utf-8')) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128) 

這個標題是指給我的問題的代碼的一部分。

if imdbValues[5] == 'N/A': 
    movie.diector = '' 
else: 
    movie.director = imdbValues[5] 

... 

movie.put() 

在這種情況下imdbValues[5]等於Claudio Fäh

+2

你應該閱讀:HTTP:// blog.notdot.net/2010/07/Getting-unicode-right-in-Python。你需要確保你在處理字節時,在處理字符串時以及在兩者之間進行轉換時應該使用什麼編碼。編碼/解碼錯誤通常是由於對字符串處理的誤解而發生的。 – 2011-05-02 03:40:42

回答

5

的異常是由這行代碼升高encode('utf-8')

unicode()函數最終使用ASCII作爲默認解碼編碼;這意味着你的安全只有通過這些類型的值:

  1. Unicode字符串
  2. 一個8位串

您的代碼可能傳遞一個字節的字符串一些編碼的unicode(value)失敗以ASCII解碼。

建議:
如果你正在處理的字節串,你必須知道它們的編碼或你的程序將遭受這種編碼/解碼的問題。

如何解決此問題:
發現你正在處理(UTF-8?)的字節串所用的編碼,並將其轉換爲Unicode字符串。
如果,例如,imdbValues是包含UTF-8編碼的字節串一些花哨IMDB Python庫返回一個列表,你應該使用它們轉換:

movie.director = imdbValues[5].decode('utf-8') 
+0

謝謝,工作完美。 – 2011-05-07 01:12:06

+0

也如果你不介意回答另一個問題,有沒有辦法做到這一點與列表。 – 2011-05-07 03:00:01

+0

@Jon嘗試列表理解:'unicode_list = [item.decode('utf-8')for imdbValues]' – systempuntoout 2011-05-07 11:48:03

2

你應該開始使用unicode您的文本數據。

無論您何時獲取數據,它們都是以字節編碼的Unicode字符。編碼可以是UTF-8UTF-16Windows-1252ISO-8859-1或許多其他編碼。如果數據存在於您的系統上,您就知道編碼。如果它們來自網頁,則編碼將包含在響應標題中,並且通常位於頁面的開頭。使用該編碼,將.decode轉換爲非常有用的unicode Python對象,並在您的代碼中使用該對象。

對輸入進行解碼,對輸出進行編碼(如果需要)。在App Engine中使用數據之前不需要進行編碼。

PS that在Unicode相關問題中的答案可能會有所幫助。

pbvalue.set_stringvalue(unicode(value).encode('utf-8')) 

當值傳遞給movie.director,該值首先被轉換以Unicode與:

unicode(value) 

然後它被編碼有

相關問題