Come convertire una stringa in utf-8 in Python


193

Ho un browser che invia caratteri utf-8 al mio server Python, ma quando lo recupero dalla stringa di query, la codifica che Python restituisce è ASCII. Come posso convertire la stringa semplice in utf-8?

NOTA: la stringa passata dal web è già codificata UTF-8, voglio solo fare Python per trattarla come UTF-8 non ASCII.



Penso che un titolo migliore sarebbe Come forzare una stringa per unicode senza traduzione?
Boatcoder

1
Nel 2018, python 3 se ricevi l'errore di decodifica ASCII do"some_string".encode('utf-8').decode('utf-8')
devssh

Risposte:


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

^ Questa è la differenza tra una stringa di byte (plain_string) e una stringa unicode.

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

^ Conversione in Unicode e specifica della codifica.


34
, Sto ricevendo il seguente errore: UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteQuesto è il mio codice: ret = [] per la riga in csvReader: cline = [] per elm nella riga: unicodestr = unicode (elm, 'utf-8') cline.append (unicodestr) ret .append (cline)
Gopakumar NG

106
Niente di tutto ciò si applica in Python 3, tutte le stringhe sono unicode e unicode()non esistono.
Noumenon,

Un po 'di sbatterlo, ma grazie. Questo risolto un problema in cui stavo cercando di stampare unicode e stavo ottenendo.
的 的 人

Come riconvertire uin un strformato (riconvertire uin s)?
Tanguy,

3
Questo codice funzionerà solo finché il testo non contiene caratteri non ASCII; un semplice carattere accentato sulla stringa lo farà fallire.
Haroldo_OK,

71

Se i metodi sopra non funzionano, puoi anche dire a Python di ignorare parti di una stringa che non può convertire in utf-8:

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

6
Got AttributeError: l'oggetto 'str' non ha attributi 'decodifica'
saran3h

2
@ saran3h sembra che tu stia usando Python 3, nel qual caso Python dovrebbe gestire i problemi di codifica per te. Hai provato a leggere il tuo documento senza specificare una codifica?
duhaime,

Python di default seleziona la codifica del sistema. In Windows 10 è cp1252 che è diverso da utf-8. Ho perso qualche ora su di esso mentre usavo codecs.open () in py 3.8
Vishesh Mangla

21

Potrebbe essere un po 'eccessivo, ma quando lavoro con ASCII e Unicode negli stessi file, ripetere la decodifica può essere una seccatura, questo è quello che uso:

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

15

Aggiunta della seguente riga all'inizio del file .py:

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

ti permette di codificare le stringhe direttamente nel tuo script, in questo modo:

utfstr = "ボールト"

1
Non è ciò che chiede l'OP. Ma evita comunque tali letterali stringa. Crea una stringa Unicode in Python 3 (buono) ma è un bytestring in Python 2 (cattivo). Aggiungi from __future__ import unicode_literalsin alto o usa il u''prefisso. Non usare caratteri non ascii nei bytesletterali. Per ottenere utf-8 byte, è possibile in utf8bytes = unicode_text.encode('utf-8')seguito se è necessario.
jfs,

1
@jfs come from __future__ import unicode_literalsmi aiuterà a convertire una stringa con caratteri non ascii in utf-8?
Ortal Turgeman,

@OrtalTurgeman Non sto rispondendo alla domanda. Guarda, è un commento, non una risposta. Il mio commento risolve il problema con il codice nella risposta. Cerca di creare un bytestring con caratteri non ascii su Python 2 (è un SyntaxError su Python 3 - i byte letterali lo vietano).
jfs,

13

Se ti capisco correttamente, hai una stringa di byte codificata utf-8 nel tuo codice.

La conversione di una stringa di byte in una stringa unicode è nota come decodifica (unicode -> stringa byte è codifica).

Puoi farlo utilizzando la funzione unicode o il metodo di decodifica . O:

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

O:

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

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

8

In Python 3.6, non hanno un metodo unicode () incorporato. Le stringhe sono già memorizzate come unicode per impostazione predefinita e non è richiesta alcuna conversione. Esempio:

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

3

Traduci con ord () e unichar (). Ogni carattere unicode ha un numero associato, qualcosa come un indice. Quindi Python ha alcuni metodi per tradurre tra un carattere e il suo numero. Un aspetto negativo è un esempio. Spero possa essere d'aiuto.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.