2011-03-14 13 views
6

Bir kütüphaneden rasgele "string" verildiğinde kontrolüm yok, "string" in unicode tipinde olduğundan ve utf-8'de kodlandığından emin olmak istiyorum. Ben hariç/try sar ve hataları aitlisteler gerçek kodundaBu, bir python unicode "dizesinin" utf-8'de kodlandığından emin olmanın en iyi yolu bu mu?

import types 

input = <some value from a lib I dont have control over> 

if isinstance(input, types.StringType): 
    input = input.decode("utf-8") 
elif isinstance(input, types.UnicodeType): 
    input = input.encode("utf-8").decode("utf-8") 

ama bu atladınız: Bu bunu yapmanın en iyi yolu olup olmadığını bilmek istiyorum.

cevap

5

Bir Unicode nesnesi kodlanmamış (bu içten ancak bu bir Python kullanıcısı olarak size saydam olmalıdır). input.encode("utf-8").decode("utf-8") satırı pek bir anlam ifade etmiyor: başlangıçta sahip olduğunuz sonun sonunda aynı Unicode karakter dizisini elde edersiniz.

if isinstance(input, str): 
    input = input.decode('utf-8') 

Unicode dizeleri dönüştürülür o str nesneleri (bayt dizeleri) sağlamak için gereken tek şey.

+0

Bu dizeyi, utf-8 kodlanmış unicode dizeleri gerektiren bir C++ lib olan başka bir lib dosyasına geçiriyorum. Unicode türü kodlamanın UTF-8 olduğundan emin olmak mümkün mü? – mcot

+1

C++ kütüphanesi Python Unicode türünün dahili kodlamasıyla etkileşim gerektirir mi? Bu şüpheli ve iç kodlamayı UTF-8 olarak önemli ölçüde değiştirebileceğinizi düşünmüyorum. Öte yandan, UTF-8: my_unicode_string.encode ('utf-8') olarak kodlanmış bir Python str nesnesi alabilirsiniz. –

+0

Harika! Cevabınızı 10 saat sonra baş ağrısından sonra buldum. –

2

Basitçe;

try: 
    input = unicode(input.encode('utf-8')) 
except ValueError: 
    pass 

Onun her zaman daha iyi izin istemek daha af dilemek için.

0

Unicode türünde depolanmış bir UTF-8 kodlanmış dizisi istediğinizden emin misiniz? Normal olarak, Python karakterleri UCS-2 veya -4 kullanarak bir types.UnicodeType içinde depolar, bazen "geniş" karakterler olarak adlandırılır, bu da tüm makul ortak betiklerden karakterleri içerme yeteneğine sahip olmalıdır.

Bu, ne tür bir lib'in, bazen türlerin çıktılarını merak ettiğini merak ediyor.StringType ve bazen types.UnicodeType. Eğer vahşi bir tahminde bulunursam, lib her zaman type.StringType üretir, ancak hangi kodlamanın içinde olduğunu söylemez. Eğer durum buysa, aslında bir karakter kümesinin ne olduğunu tahmin edebilecek kod arıyorsunuz.StringType kodlanmış gibi. Bir çok durumda, örneğin, örn. latin-1 veya UTF-8. Metin aslında tek bir kodlamada (örneğin, gelen postayla uygun başlık) olabilirse, kodlamayı tahmin eden bir lib'a ihtiyacınız vardır. Bakınız http://chardet.feedparser.org/.

2

Unicode ve kodlamaları yanlış anladığınızı düşünüyorum. Unicode karakterler sadece sayılardır. Kodlamalar, sayıların temsilidir. Unicode karakterlerini on beş gibi bir kavram olarak ve 15, 1111, F, XV gibi kodlamaları düşünün. Bir kodlamayı çözmeden ve Unicode değerini "bilmeden" önce kodlamayı (ondalık, ikili, onaltılık, romen rakamları) bilmelisiniz.

Giriş dizesi üzerinde hiçbir denetiminiz yoksa, bunu herhangi bir şeye dönüştürmek zordur. Örneğin, girdi bir dosyadan okunduğunda, metin dosyasının kodlamasını decode'a anlamlı bir şekilde Unicode'a ve ardından encode C++ kütüphanenize 'UTF-8' olarak bilmeniz gerekir.

İlgili konular