2015-06-04 15 views
14

Ülkeler listesi için django_countries modülünü kullanıyorum, sorun, 'Åland Islands' ve 'Saint Barthélemy' gibi özel karakterleri olan birkaç ülke var.django ülkeleri kodlama doğru isim vermiyor

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

O country_label django Araçlarının tembel tercüme vekil nesne olduğunu biliyorum, ama buna 'Ã…land Islands' verir oldukça doğru ismi vermiyor:

Ben ülke adı almak için bu yöntemi arıyorum. Bunun için herhangi bir öneri lütfen?

cevap

0

deneyin:

from __future__ import unicode_literals #Place as first import. 

VE/VEYA

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

her iki çözüm de çalışmaz. İkincisi istisna verir. İkinci seçenek I 'UnicodeDecodeError UnicodeDecodeError olsun: 'UTF-8' kodek pozisyonunda 0 bayt 0xc5 deşifre: geçersiz devam bayt ' – Maverick

4

Django saklar unicode dize kullanarak kod noktaları ve daha sonraki işlemler için Unicode olarak dizeyi tanımlar. UTF-8, dört 8 bit bayt kodlaması kullanır, bu nedenle Django tarafından kullanılan unicode dizesinin kod noktası gösteriminin bir noktada UTF-8 notasyonuna kodlanması veya yorumlanması gerekir. Åland Adaları'nda, olması gereken şey, UTF-8 byte kodlamasını alıp dizgeyi dönüştürmek için kod noktaları olarak yorumlamasıdır.

django_countries döndürme dizgisi büyük olasılıkla u'\xc5land Islands''dır; burada \xc5, Å'nin UTF kod noktası gösterimidir. UTF-8 bayt gösteriminde \xc5, \xc3\x85 olur ve burada her bir \xc3 ve \x85, 8 bitlik bir bayttır. Bkz: http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=xc5&mode=hex

Yoksa country_label = fields.Country kullanabilirsiniz (form.cleaned_data.get ('ülke') [0: 2]). Name.encode ('utf-8') u'\xc5land Islands' gitmek için '\xc3\x85land Islands'

sonra her bayt alıp kod noktaları olarak onları kullanırsanız, bu size bu karakterleri vereceğiz göreceksiniz: Ã… bkz: http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=xc3&mode=hex ve: html gösterimi ile http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=x85&mode=hex

bakınız kod parçacığı bu karakterler.

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

Bu yüzden size uygulamada 2 farklı kodlamaları var tahmin ediyorum. Tek yönlü '\xc3\x85' için u'\xc5' dönüştürmek ve daha sonra u'\xc3\x85land Islands' verecekti iso-8859 den unicode için deşifre olur UTF-8'e bir utf-8 çevre kodlamak olacaktır u'\xc5land Islands' u'\xc3\x85land Islands' noktasından hedefine. Ama sağladığınız kodda olmadığından, country_label'u ayarladığınız an ile çıkışınızın düzgün gösterilmediği an arasında bir yerde olduğunu tahmin ediyorum. Kodlama ayarları nedeniyle otomatik olarak veya bir yerlerde açık bir atama yoluyla.

İLK DÜZENLEME:

, uygulamanın sizin kodlamasını belirlemek Şablonunuzun içinde py dosyası ve <meta charset="UTF-8"> üstündeki # -*- coding: utf-8 -*- ekleyin. Ve bir django.utils.functional gelen unicode dize almak için. proxy nesnesi ile unicode() numaralı telefonu arayabilirsiniz.

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

İKİNCİ DÜZENLEME: Sorun force_bytes (https://docs.djangoproject.com/en/1.8/ref/utils/#module-django.utils.encoding) kullanmak olacaktır nerede anlamaya

bir diğer yolu bu gibi:

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') 

Ama senin beri böyle Çok sayıda dönüşüm başarılı olmadan denedi, belki sorun daha karmaşıktır. django_countries, Python sürümünüzü ve django uygulama dil ayarlarınızı paylaşabilir misiniz? Ayrıca yapabileceğiniz şey, doğrudan djano_countries paketinizde (python dizininizde olması gereken) doğrudan görün, data.py dosyasını bulun ve neye benzediğini görmek için açın. Belki de veri bozuktur.

+0

I' country_label = fields.Country (form.cleaned_data.get ('ülke' kullanılmış) [0: 2]) kodda name.encode ('utf-8') 'ancak yine de Ã… land' olarak işlenir. Şablonu almak için render yöntemini kullanıyorum. – Maverick

+0

Düzenleme görüyorum, country_label'in içerik için doğrudan doğruya gittiğini ve işlenmeden önce db'ye kaydedilmediğini varsayalım? –

+0

@mad_programmer Kodlama argümanını 'unicode()' ye iletirseniz, şu şekilde olur: unicode (fields.Country (...). Name, 'UTF-8') '? – xyres

0

Sadece bu hafta benzer bir kodlama hatasıyla karşılaştım. Sorunun, makine kodlamasının Python'daki ile aynı olması nedeniyle olduğuna inanıyorum. Bunu .bashrc veya .zshrc'a eklemeyi deneyin.

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

Ardından, yeni bir terminal açın ve Django uygulamasını yeniden çalıştırın.

İlgili konular