2010-03-31 13 views
5

Sto elaborando un file UTF-8 in Python e ho usato simplejson per caricarlo in un dizionario. Tuttavia, sto diventando un UnicodeDecodeError quando cerco di trasformare uno dei valori del dizionario in una stringa:Python: perché str() su un testo da un file UTF-8 fornisce un errore 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) 

Perché Python anche utilizzando ASCII? Pensavo usasse UTF-8 di default e l'input provenga da un file UTF-8.

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

Qual è il problema?

risposta

6

Python 2.x utilizza ASCII di default . Utilizzare unicode.encode() se si vuole trasformare un unicode in un str:

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

Grazie! Per codificare tutti gli elementi nel dizionario, ho fatto: per k, v in v_dict.iteritems(): if v_dict [k]: v_dict [k] = v_dict [k] .encode ('utf-8') – AP257

2

Un modo per fare questo lavoro potrebbe essere quella di impostare la codifica predefinita a UTF-8 in modo esplicito, come:

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

Questo potrebbe portare a conseguenze indesiderate se non si vuole che tutto sia Unicode per default .

un modo più pulito potrebbe essere quella di utilizzare la funzione unicode piuttosto che str:

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

o specificare la codifica in modo esplicito:

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

Problemi correlati