2010-03-31 4 views
5

Przetwarzam plik UTF-8 w Pythonie i użyłem simplejson do załadowania go do słownika. Jednak Dostaję UnicodeDecodeError gdy próbuję włączyć jedną z wartości słownikowych na ciąg znaków:Python: dlaczego funkcja str() w przypadku niektórych tekstów z pliku UTF-8 podaje kod UnicodeDecodeError?

f = open('my_json.json', 'r') 
master_dictionary = json.load(f) 
#some json wrangling, then it fails on this line... 
mysql_string += " ('" + str(v_dict['code']) 
Traceback (most recent call last): 
    File "my_file.py", line 25, in <module> 
    str(v_dict['code']) + "'), " 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf4' in position 35: ordinal not in range(128) 

Dlaczego Python nawet przy użyciu ASCII? Myślałem, że domyślnie używa UTF-8, a dane wejściowe pochodzą z pliku UTF-8.

$ file my_json.json 
my_json.json: UTF-8 Unicode English text 

Na czym polega problem?

Odpowiedz

6

Python 2.x korzysta domyślnie ASCII . Użyj unicode.encode() jeśli chcesz włączyć unicode do str:

v_dict['code'].encode('utf-8') 
+0

Dzięki! Aby zakodować wszystkie elementy w słowniku, zrobiłem: dla k, v w v_dict.iteritems(): if v_dict [k]: v_dict [k] = v_dict [k] .encode ('utf-8') – AP257

2

Jednym ze sposobów, aby to działało byłoby ustawić domyślne kodowanie na UTF-8 wyraźnie, jak:

import sys 
sys.setdefaultencoding("utf-8") 

Mogłoby to doprowadzić do niezamierzonych konsekwencji, jeśli nie chcesz, żeby wszystko było Unicode domyślnie .

Czystsze sposobem może być użycie funkcji unicode zamiast str:

mysql_string += " ('" + unicode(v_dict['code'])

lub określić kodowanie wyraźnie:

mysql_string += " ('" + unicode(v_dict['code'], "utf-8")

Powiązane problemy