2010-11-15 22 views
118

Mam przeglądarkę, która wysyła znaki utf-8 do mojego serwera Python, ale po pobraniu go z ciągu zapytania, kodowanie, które zwraca Python jest ASCII. Jak mogę przekonwertować zwykły ciąg znaków na utf-8?Jak przekonwertować ciąg znaków na utf-8 w Pythonie

UWAGA: Ciąg przekazywany z Internetu jest już zakodowany w formacie UTF-8, chcę tylko, aby Python traktował go jako UTF-8, a nie ASCII.

+0

Spróbuj ten link [http://evanjones.ca/python-utf8.html](http://evanjones.ca/python-utf8.html) – Mudassir

+0

myślę, że lepiej byłoby tytuł ** Jak przymusić ciąg do Unicode bez tłumaczenia?** – boatcoder

Odpowiedz

184
>>> plain_string = "Hi!" 
>>> unicode_string = u"Hi!" 
>>> type(plain_string), type(unicode_string) 
(<type 'str'>, <type 'unicode'>) 

^Jest to różnica między łańcuchem bajtowym (plain_string) i łańcuchem unicode.

>>> s = "Hello!" 
>>> u = unicode(s, "utf-8") 

^Konwersja na kod Unicode i określenie kodowania.

+25

, otrzymuję następujący błąd: 'UnicodeDecodeError: 'utf8' kodek nie potrafi dekodować bajtowy 0xb0 w pozycji 2: nieprawidłowy rozpoczęcia byte' To jest mój kod: ret = [] dla linii CsvReader : Cline = [] Elm zgodne: unicodestr = unikodzie (wiąz, UTF-8 ') cline.append (unicodestr) ret.append (Cline) –

+29

Żaden z tym zastosowanie w Pythonie 3, wszystkie komunikaty są unikodami i 'unicode()' nie istnieje. – Noumenon

+0

Coś w tym stylu, ale dzięki. Rozwiązało to problem polegający na tym, że próbowałem wydrukować kod Unicode i otrzymałem s. –

10

Jeśli dobrze cię rozumiem, w kodzie jest zakodowany kod bajtowy utf-8.

Konwertowanie ciągu bajtów na ciąg znaków Unicode jest znany jako dekodowanie (kodowanie kodu Unicode -> Bajt).

Robisz to za pomocą funkcji unicode lub metody decode. Albo:

unicodestr = unicode(bytestr, encoding) 
unicodestr = unicode(bytestr, "utf-8") 

Lub:

unicodestr = bytestr.decode(encoding) 
unicodestr = bytestr.decode("utf-8") 
50

Jeśli powyższe metody nie działają, można także powiedzieć Python ignorować fragmenty łańcucha, że ​​nie można przekonwertować na UTF-8:

stringnamehere.decode('utf-8', 'ignore') 
+4

Uff, wielkie dzięki, ten spokój kodu wreszcie zakończył moje minidomowe kłopoty! – Alex

+15

* spokój kodu * .... nie wiem, czy literówka ... – user1717828

11

dodając następującą linię do początku pliku .py:

# -*- coding: utf-8 -*- 

pozwala kodować ciągów bezpośrednio w skrypcie, tak:

utfstr = "ボールト" 
+1

To nie jest to, o co prosi OP. Ale unikaj takich literałów ciągów. Tworzy napis Unicode w Pythonie 3 (dobry), ale jest to test bytowy w Pythonie 2 (zły). Albo dodaj 'from __future__ importuj unicode_literals' na górze lub użyj prefiksu' u'''. Nie używaj znaków spoza ASCII w literałach "bytes". Aby uzyskać bajty utf-8, możesz 'utf8bytes = unicode_text.encode ('utf-8')' później, jeśli jest to konieczne. – jfs

15

może być trochę przesada, ale kiedy pracuję z ASCII i Unicode w tych samych plikach, powtarzając dekodowania może być ból, to co Używam:

def make_unicode(input): 
    if type(input) != unicode: 
     input = input.decode('utf-8') 
     return input 
    else: 
     return input 
3

W Pythonie 3.6 nie mają wbudowanej funkcji unicode(). Aby przekonwertować ciąg Unicode, po prostu uzyskać wartość Unicode znaku, a to zrobić:

my_str = "\u221a25" 
my_str = u"{}".format(my_str) 
print(my_str) 
>>> √25 
5
city = 'Ribeir\xc3\xa3o Preto' 
print city.decode('cp1252').encode('utf-8') 
+0

Po godzinach próbowania odczytania pliku z nazwami miast, w końcu to zadziałało. – Christian

1

Translate z ord() i unichar(). Każdy znak Unicode ma przypisany numer, podobnie jak indeks. Tak więc Python ma kilka metod tłumaczenia między znakiem a jego numerem. Minusem jest ñ przykład. Mam nadzieję, że to pomoże.

>>> C = 'ñ' 
>>> U = C.decode('utf8') 
>>> U 
u'\xf1' 
>>> ord(U) 
241 
>>> unichr(241) 
u'\xf1' 
>>> print unichr(241).encode('utf8') 
ñ 
Powiązane problemy