2011-07-15 19 views
27

Dize karakter kümesini algılayacak herhangi bir evrensel yöntem var mı? IPTC etiketlerini kullanıyorum ve bilinen bir kodlama yok. Onu tespit etmeli ve sonra utf-8'e değiştirmeliyim.Python - karakter kümesini algılayıp utf-8 dönüştürün

Herkes yardımcı olabilir?

+0

, ben onlarla oynayabilir ve sorunun ne olduğunu anlamak, böylece sorunuzun içine "Yok" dizesinin birkaç örnek yapıştırmak için davet ediyorum. Bahsedilen portalda yaptığınız gibi, şifresi çözülmüş sürümlerini de yapıştırabilirsiniz. – mac

cevap

31

Sen chardet, Biraz geç oldu bir kodlama detektörü

+2

Çalışmıyor, burada sormadan önce onu yaptım. Bazı dizeler Yok şifrelemeyi alır, ancak bu doğru değildir. Etiketler bir şekilde kodlanır çünkü 1 web portalında tanınmaktadır. – robos85

+0

+1: chardet, kodlama tespiti yapmanın en güncel yöntemlerinden biri gibi görünüyor. @ robos85: Mükemmel bir kodlama algılaması yapmak mümkün değildir: http://stackoverflow.com/questions/436220/python-is-there-a-way-to-determine-the-encoding-of-text-file/ 436299 # 436299. – EOL

+1

Dili bilmeyi temel alarak kodlamayı tespit etmenin çok daha başarılı bir yolunu geliştirdim. 8 bitlik kodlamaları doğru alır. En sonunda. – tchrist

13

kullanmak istiyorum, ama başka bir çözüm de var: pyicu kullanmayı deneyin.

Bir örnek:

import icu 
def convert_encoding(data, new_coding='UTF-8'): 
    coding = icu.CharsetDetector(data).detect().getName() 
    if new_coding.upper() != coding.upper(): 
     data = unicode(data, coding).encode(new_coding) 
    return data 
+0

pyicu ve bazen bazı kodlamaları özlüyor: http://sourceforge.net/p/icu/mailman/icu-design/thread/[email protected]com/ – coanor

+5

@coanor: * Tüm testler için kodlamayı doğru şekilde belirlemenin bir yolu olmadığından * herhangi bir * kodlama detektörü bazı durumlarda başarısız olur – MestreLion

2

Chardet daha hızlı olduğu söylenir cchardet

adlı başka modül yoktur. Eğer cchardet ile yapmak isterseniz onu Cython

11

gerektirir

Not, bu işlevi kullanabilirsiniz. @Ignacio Yorumunuzun baktığımızda

import cchardet 
def convert_encoding(data, new_coding = 'UTF-8'): 
    encoding = cchardet.detect(data)['encoding'] 

    if new_coding.upper() != encoding.upper(): 
    data = data.decode(encoding, data).encode(new_coding) 

    return data 
İlgili konular