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.



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.


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')

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

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 = "ボールト"

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")

10
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')

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

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')
ñ

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.