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">Ã…Å</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.
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