2011-07-15 13 views
27

Czy istnieje uniwersalna metoda wykrywania zestawu znaków? Używam tagów IPTC użytkownika i nie znam żadnego kodowania. Muszę to wykryć, a następnie zmienić je na utf-8.Python - wykryj zestaw znaków i przekonwertuj na utf-8

Ktoś może pomóc?

+0

Patrząc na swoim komentarzu do @Ignacio, chciałbym zaprosić was do wklejenia kilka przykładów „none” ciąg na swoje pytanie, tak, że możemy bawić się z nimi i zrozumieć na czym polega problem. Byłoby pomocne, gdybyś mógł również wkleić ich poprawną dekodowaną wersję, jak to zrobiono na portalu, o którym wspomniałeś. – mac

Odpowiedz

31

Chcesz użyć chardet, detektor kodowania

+2

To nie działa, podważam to zanim zapytam tutaj. Niektóre łańcuchy otrzymują kodowanie None, ale nie jest to prawdą. Tagi są zakodowane w jakiś sposób, ponieważ na 1 portalu internetowym są rozpoznawane. – robos85

+0

+1: chardet wydaje się być jednym z najlepszych sposobów wykrywania kodowania. @ robos85: Nie można wykonać doskonałego wykrywania kodowania: http://stackoverflow.com/questions/436220/python-is-there-a-way-to-etetine-tode-encoding-of-text-file/ 436299 # 436299. – EOL

+1

Opracowałem znacznie skuteczniejszy sposób wykrywania kodowania, oparty na znajomości języka. Otrzymuje 8-bitowe kodowanie w prawo. Wreszcie. – tchrist

13

To trochę późno, ale jest też inne rozwiązanie: spróbuj użyć pyicu.

Przykład:

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 oparty na OIOM, a czasem zabraknie wykrywa jakieś kodowanie: http://sourceforge.net/p/icu/mailman/icu-design/thread/[email protected]com/ – coanor

+5

@coanor: * dowolny wykrywacz kodowania zawodzi w niektórych przypadkach, ponieważ nie ma możliwości dokładnego określenia kodowania dla wszystkich testów – MestreLion

11

Jeśli chcesz to zrobić z cchardet, można użyć tej funkcji.

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