Cum se convertește un șir de caractere în utf-8 în Python (Programare, Python, Python 2.7, Unicode, Utf 8)

Bin Chen a intrebat.

Am un browser care trimite caractere utf-8 către serverul meu Python, dar când îl recuperez din șirul de interogare, codificarea pe care Python o returnează este ASCII. Cum pot să convertesc șirul simplu în utf-8?

NOTĂ: Șirul transmis de pe web este deja codat UTF-8, vreau doar să fac Python să îl trateze ca UTF-8 și nu ca ASCII.

Comentarii

  • Încercați acest link http://evanjones.ca/python-utf8.html –  > Por Mudassir.
  • Cred că un titlu mai bun ar fi Cum să forțați un șir de caractere în unicode fără traducere? –  > Por boatcoder.
  • În 2018, python 3 dacă primiți o eroare de decodare ascii faceți "some_string".encode('utf-8').decode('utf-8') –  > Por devssh.
10 răspunsuri
user225312

În Python 2

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

^ Aceasta este diferența dintre un șir de octeți (plain_string) și un șir unicode.

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

^ Conversia în unicode și specificarea codificării.

În Python 3

Toate șirurile de caractere sunt unicode. Adresa unicode nu mai există. A se vedea răspunsul de la @Noumenon

Comentarii

    36

  • ,Primesc următoarea eroare: UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byte Acesta este codul meu: ret=[] for line in csvReader: cline=[] for elm in line: unicodestr = unicode(elm, ‘utf-8’) cline.append(unicodestr) ret.append(cline) –  > Por Gopakumar N G.
  • 115

  • Nimic din toate acestea nu se aplică în Python 3, toate șirurile de caractere sunt unicode și unicode() nu există. –  > Por Noumenon.
  • Un fel de bumping acest lucru, dar mulțumesc. Acest lucru a rezolvat o problemă în care încercam să tipăresc unicode și primeam �s. –  > Por 智障的人.
  • Cum se face conversia u înapoi într-un str format (convertiți u înapoi în s)? –  > Por Tanguy.
  • Acest cod va funcționa doar atâta timp cât textul nu conține caractere non-ascii; un simplu caracter accentuat pe șirul de caractere îl va face să eșueze. –  > Por Haroldo_OK.
duhaime

Dacă metodele de mai sus nu funcționează, puteți, de asemenea, să-i spuneți lui Python să ignore porțiunile dintr-un șir pe care nu le poate converti în utf-8:

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

Comentarii

  • Am primit AttributeError: obiectul ‘str’ nu are atributul ‘decode’ –  > Por saran3h.
  • @saran3h se pare că folosești Python 3, caz în care Python ar trebui să să se ocupe de problemele de codificare pentru tine. Ați încercat să citiți documentul fără să specificați o codificare? –  > Por duhaime.
  • Python alege în mod implicit codificarea sistemului. În windows 10 este cp1252, care este diferită de utf-8. Am pierdut câteva ore în timp ce foloseam codecs.open() în py 3.8 –  > Por Vishesh Mangla.
Blueswannabe

S-ar putea fi un pic exagerat, dar când lucrez cu ascii și unicode în aceleași fișiere, repetarea decodificării poate fi o durere, asta este ceea ce folosesc:

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

Ken

Adăugarea următoarei linii în partea de sus a fișierului .py:

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

vă permite să codificați șirurile de caractere direct în scriptul dvs., astfel:

utfstr = "ボールト"

Comentarii

  • Nu este ceea ce solicită OP. Dar evitați oricum astfel de literali de șiruri de caractere. Creează un șir Unicode în Python 3 (bun), dar este un bytestring în Python 2 (rău). Fie adăugați from __future__ import unicode_literals în partea de sus sau folosiți u'' prefix. Nu folosiți caractere non-ascii în bytes literale. Pentru a obține octeți utf-8, puteți utf8bytes = unicode_text.encode('utf-8') mai târziu, dacă este necesar. –  > Por jfs.
  • @jfs cum va from __future__ import unicode_literals mă ajută să convertesc un șir de caractere non-ascii în utf-8? –  > Por Ortal Turgeman.
  • @OrtalTurgeman Nu răspund la întrebare. Uite, este un comentariu, nu un răspuns. Comentariul meu abordează problema cu codul din răspuns. Acesta încearcă să creeze un bytestring cu caractere non-ascii pe Python 2 (este o eroare de sintaxă pe Python 3 – literalele de octeți interzic acest lucru). –  > Por jfs.
codeape

Dacă înțeleg corect, aveți un byte-string codat în utf-8 în codul dvs.

Conversia unui byte-string într-un șir unicode este cunoscută sub numele de decodare (unicode -> byte-string este codificare).

Această operațiune se realizează prin utilizarea funcției unicode sau funcția decode . Fie:

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

Sau:

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

Willem
city = 'Ribeirxc3xa3o Preto'
print city.decode('cp1252').encode('utf-8')

Comentarii

  • acesta este răspunsul corect IMO –  > Por Michael S.
Zld Productions

În Python 3.6, nu au o metodă unicode() încorporată. șirurile de caractere sunt deja stocate ca unicode în mod implicit și nu este necesară nicio conversie. Exemplu:

my_str = "u221a25"
print(my_str)
>>> √25

Joe9008

Traduceți cu ord() și unichar().Fiecare unicode char are asociat un număr, ceva de genul unui index. Astfel, Python dispune de câteva metode pentru a traduce între un caracter și numărul său. Dezavantajul este un exemplu ñ. Sper că vă poate ajuta.

>>> C = 'ñ'
>>> U = C.decode('utf8')
>>> U
u'xf1'
>>> ord(U)
241
>>> unichr(241)
u'xf1'
>>> print unichr(241).encode('utf8')
ñ

shioko
  • În primul rând, str în Python este reprezentat în Unicode.
  • În al doilea rând, UTF-8 este un standard de codificare pentru a codifica Unicode șir de caractere în bytes. Există multe standarde de codificare (de ex. UTF-16, , ASCII, , SHIFT-JIS, , etc.).

Atunci când clientul trimite date către serverul dvs. și utilizează UTF-8, trimite o grămadă de bytes nu str.

Ați primit un str pentru că „biblioteca” sau „cadrul” pe care îl utilizați a convertit implicit niște date aleatorii în bytes în str.

Sub capotă, există doar o grămadă de bytes. Trebuie doar să cereți „bibliotecii” să vă dea conținutul cererii în format bytes și vă veți ocupa singur de decodare (dacă biblioteca nu vă poate da acest lucru, atunci încearcă să facă magie neagră și nu ar trebui să o utilizați).

  • Decodare UTF-8 codificat bytes în str: bs.decode('utf-8')
  • Encode str la UTF-8 bytes: s.encode('utf-8')

David-Star

Da, puteți adăuga

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

în prima linie a codului sursă.

Puteți citi mai multe detalii aici https://www.python.org/dev/peps/pep-0263/