Jak przekonwertować ciąg znaków na utf-8 w Pythonie

193

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

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

Bin Chen
źródło
Wypróbuj ten link http://evanjones.ca/python-utf8.html
Mudassir
Myślę, że lepszym tytułem byłoby Jak zmusić ciąg znaków do Unicode bez tłumaczenia?
Boatcoder
1
W 2018 roku python 3, jeśli "some_string".encode('utf-8').decode('utf-8')
pojawi się

Odpowiedzi:

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

^ Jest to różnica między ciągiem bajtów (zwykły_ciąg) a ciągiem Unicode.

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

^ Konwersja do Unicode i określenie kodowania.

użytkownik225312
źródło
34
, Otrzymuję następujący błąd: UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteTo jest mój kod: ret = [] dla wiersza w csvReader: cline = [] dla wiązu w wierszu: unicodestr = unicode (wiąz, 'utf-8') cline.append (unicodestr) ret .append (cline)
Gopakumar NG
105
W Pythonie 3 nie ma to zastosowania, wszystkie łańcuchy są Unicode i unicode()nie istnieją.
Noumenon,
Jakoś wpadając na to, ale dziękuję. To naprawiło problem, w którym próbowałem wydrukować Unicode i otrzymywałem s.
智障 的 人
Jak przekonwertować z upowrotem na strformat (przekonwertować z upowrotem na s)?
Tanguy
3
Ten kod będzie działał tylko tak długo, jak długo tekst nie będzie zawierał znaków innych niż ascii; prosty akcentowany znak na sznurku sprawi, że zawiedzie.
Haroldo_OK,
71

Jeśli powyższe metody nie działają, możesz również powiedzieć Pythonowi, aby zignorował fragmenty ciągu, których nie może przekonwertować na utf-8:

stringnamehere.decode('utf-8', 'ignore')
duhaime
źródło
6
Got AttributeError: obiekt „str” nie ma atrybutu „dekodowania”
saran3h,
2
@ saran3h wygląda na to, że używasz Pythona 3, w którym to przypadku Python powinien rozwiązać problemy z kodowaniem. Czy próbowałeś odczytać dokument bez podania kodowania?
duhaime,
Python domyślnie wybiera kodowanie systemowe. W Windows 10 jest to cp1252, który różni się od utf-8. Zmarnowałem na to kilka godzin, używając codecs.open () w py 3.8
Vishesh Mangla
21

Może to być trochę przesada, ale kiedy pracuję z ascii i Unicode w tych samych plikach, powtarzanie dekodowania może być uciążliwe, oto czego używam:

def make_unicode(input):
    if type(input) != unicode:
        input =  input.decode('utf-8')
    return input
Blueswannabe
źródło
15

Dodanie następującego wiersza na górze pliku .py:

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

pozwala kodować ciągi bezpośrednio w skrypcie, w następujący sposób:

utfstr = "ボールト"
Rozpoznać
źródło
1
O to nie prosi OP. Ale i tak unikaj literałów łańcuchowych. Tworzy ciąg znaków Unicode w Pythonie 3 (dobry), ale jest to testowanie w Pythonie 2 (zły). Dodaj from __future__ import unicode_literalsna górze lub użyj u''prefiksu. Nie używaj literatów innych niż ascii bytes. Aby uzyskać bajty utf-8, możesz utf8bytes = unicode_text.encode('utf-8')później, jeśli to konieczne.
jfs
1
@jfs, w jaki sposób from __future__ import unicode_literalspomoże mi przekonwertować ciąg znaków innych niż ascii na utf-8?
Ortal Turgeman
@OrtalTurgeman Nie odpowiadam na pytanie. Posłuchaj, to komentarz, a nie odpowiedź. Mój komentarz dotyczy problemu z kodem w odpowiedzi. Próbuje utworzyć bajtowanie ze znakami nie-ascii w Pythonie 2 (jest to błąd składniowy w Pythonie 3 - literały bajtów zabraniają tego).
jfs
13

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

Konwersja ciągu bajtowego na ciąg Unicode jest znana jako dekodowanie (Unicode -> ciąg bajtów jest kodowany).

Robisz to za pomocą funkcji Unicode lub metody dekodowania . Zarówno:

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

Lub:

unicodestr = bytestr.decode(encoding)
unicodestr = bytestr.decode("utf-8")
Codeape
źródło
10
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')
Willem
źródło
8

W Pythonie 3.6 nie mają wbudowanej metody unicode (). Ciągi są już domyślnie przechowywane jako Unicode i konwersja nie jest wymagana. Przykład:

my_str = "\u221a25"
print(my_str)
>>> 25
Zld Productions
źródło
3

Przetłumacz za pomocą ord () i unichar (). Każdy znak Unicode ma przypisany numer, coś w rodzaju indeksu. Python ma więc kilka metod na translację między char i jego liczbą. Minusem jest przykład. Mam nadzieję, że to może pomóc.

>>> C = 'ñ'
>>> U = C.decode('utf8')
>>> U
u'\xf1'
>>> ord(U)
241
>>> unichr(241)
u'\xf1'
>>> print unichr(241).encode('utf8')
ñ
Joe9008
źródło