2015-06-04 16 views
14

Sto usando il modulo django_countries per la lista Paesi, il problema è che ci sono un paio di paesi con caratteri speciali come 'Åland Islands' e 'Saint Barthélemy'.La codifica dei paesi django non sta dando il nome corretto

io chiamo questo metodo per ottenere il nome del paese:

country_label = fields.Country(form.cleaned_data.get('country')[0:2]).name 

So che country_label è pigro oggetto proxy tradotto di Django utils, ma non sta dando il nome giusto, piuttosto che dà 'Ã…land Islands'. qualche suggerimento per questo per favore?

risposta

0

try:

from __future__ import unicode_literals #Place as first import. 

E/O

country_label = fields.Country(form.cleaned_data.get('country')[0:2]).name.encode('latin1').decode('utf8') 
+0

entrambe le soluzioni non funzionano. Il secondo dà un'eccezione. Nella seconda opzione ottengo 'UnicodeDecodeError UnicodeDecodeError: codec 'utf8' non può decodificare byte 0xc5 in posizione 0: non valida prosecuzione byte ' – Maverick

4

Django esercizi unicode punti di codice utilizzando stringa e identifica la stringa come unicode per un'ulteriore elaborazione. UTF-8 utilizza quattro codifiche a 8 bit, quindi la stringa unicode che viene utilizzata da Django deve essere decodificata o interpretata dalla notazione del punto di codice alla sua notazione UTF-8 a un certo punto. Nel caso delle Isole Åland, ciò che sembra accadere è che sta prendendo la codifica UTF-8 byte e la interpreta come punti codice per convertire la stringa.

La stringa django_countries restituisce molto probabilmente u'\xc5land Islands' dove \xc5 è la notazione del punto di codice UTF di Å. Nella notazione di byte UTF-8 \xc5 diventa \xc3\x85 dove ciascun numero \xc3 e \x85 è un byte di 8 bit. Vedere: http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=xc5&mode=hex

Oppure si può utilizzare country_label = fields.Country (form.cleaned_data.get ('paese') [0: 2]). Name.encode ('utf-8') per andare da u'\xc5land Islands' a '\xc3\x85land Islands'

Se si prende poi ogni byte e li usa come punti di codice, vedrete che ti do questi personaggi: Ã… See: http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=xc3&mode=hex e: http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=x85&mode=hex

codice See frammento con html notazione questi personaggi

<div id="test">&#xC3;&#x85;&#xC5;</div>

Quindi immagino si hanno 2 differenti codifiche a voi l'applicazione. Un modo per ottenere u'\xc5land Islands'-u'\xc3\x85land Islands' sarebbe in un ambiente di codifica UTF-8 a UTF-8, che convertirebbe u'\xc5' a '\xc3\x85' e poi decodificare a unicode da iso-8859 che darebbe u'\xc3\x85land Islands'. Ma dal momento che non è nel codice che stai fornendo, suppongo che stia accadendo da qualche parte tra il momento in cui imposti lo country_label e il momento in cui l'output non viene visualizzato correttamente. Sia automaticamente a causa delle impostazioni di codifica, sia attraverso un'assegnazione esplicita da qualche parte.

prima modifica:

Per impostare la codifica per voi app, aggiungere # -*- coding: utf-8 -*- nella parte superiore del file py e <meta charset="UTF-8"> in del vostro modello. E per ottenere una stringa unicode da un django.utils.functional. proxy oggetto è possibile chiamare unicode(). Come questo:

country_label = unicode(fields.Country(form.cleaned_data.get('country')[0:2]).name) 

SECONDO EDIT:

Un altro modo per capire dove il problema è sarebbe quella di utilizzare force_bytes (https://docs.djangoproject.com/en/1.8/ref/utils/#module-django.utils.encoding) Ti piace questa:

from django.utils.encoding import force_bytes 
country_label = fields.Country(form.cleaned_data.get('country')[0:2]).name 
forced_country_label = force_bytes(country_label, encoding='utf-8', strings_only=False, errors='strict') 

Ma dal momento che ho già provato molte conversioni senza successo, forse il problema è più complesso. Puoi condividere la tua versione di django_countries, Python e le impostazioni della lingua dell'app django? Quello che puoi fare è anche andare a vedere direttamente nel tuo pacchetto djano_countries (che dovrebbe essere nella tua directory python), trovare il file data.py e aprirlo per vedere come appare. Forse i dati stessi sono corrotti.

+0

ho usato 'country_label = fields.Country (form.cleaned_data.get ('paese') [0: 2]). Name.encode ('utf-8') 'nel codice ma ancora reso come' Ã ... land'. Sto usando il metodo render per ottenere il modello. – Maverick

+0

Vedi modifica, suppongo che country_label vada direttamente al contesto e non sia salvato in db prima del rendering? –

+0

@mad_programmer Cosa succede se si passa l'argomento di codifica a 'unicode()', come questo: 'unicode (fields.Country (...). Name, 'UTF-8')'? – xyres

0

Proprio questa settimana ho riscontrato un errore di codifica simile. Credo che il problema sia perché la codifica della macchina è diversa da quella su Python. Prova ad aggiungere questo al tuo .bashrc o .zshrc.

export LC_ALL=en_US.UTF-8 
export LANG=en_US.UTF-8 

Quindi, aprire un nuovo terminale ed eseguire nuovamente l'app Django.