Como converter uma string para utf-8 em Python


192

Eu tenho um navegador que envia caracteres utf-8 para o meu servidor Python, mas quando eu o recupero da string de consulta, a codificação que o Python retorna é ASCII. Como posso converter a string simples para utf-8?

OBSERVAÇÃO: A string transmitida da Web já está codificada em UTF-8, só quero fazer com que o Python trate como UTF-8 e não ASCII.



Eu acho que um título melhor seria Como coagir uma string para unicode sem tradução?
boatcoder

1
Em 2018, python 3 se você receber erro ascii decodificação fazer"some_string".encode('utf-8').decode('utf-8')
devssh

Respostas:


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

^ Essa é a diferença entre uma sequência de bytes (string_ simples) e uma sequência unicode.

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

^ Convertendo para unicode e especificando a codificação.


34
, Estou recebendo o seguinte erro: UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteEste é o meu código: ret = [] para linha em csvReader: cline = [] para elm em linha: unicodestr = unicode (elm, 'utf-8') cline.append (unicodestr) ret .append (cline)
Gopakumar NG

102
Nada disso se aplica ao Python 3, todas as strings são unicode e unicode()não existem.
Noumenon

Tipo de bater isso, mas obrigado. Isso corrigiu um problema em que eu estava tentando imprimir unicode e estava recebendo `` s ''.
智障的人

Como converter de uvolta para um strformato (converter de uvolta para s)?
Tanguy

3
Esse código funcionará apenas enquanto o texto não contiver caracteres não-ascii; um caractere acentuado simples na string fará com que ela falhe.
Haroldo_OK 16/02

71

Se os métodos acima não funcionarem, você também pode dizer ao Python para ignorar partes de uma string que não pode ser convertida em utf-8:

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

6
Got AttributeError: objeto 'str' tem nenhum atributo 'decodificação'
saran3h

2
@ saran3h parece que você está usando o Python 3; nesse caso, o Python deve lidar com problemas de codificação para você. Você já tentou ler seu documento sem especificar uma codificação?
Duhaime

Por padrão, o Python seleciona a codificação do sistema. No Windows 10, é o cp1252, que é diferente do utf-8. Eu perdi algumas horas usando o codecs.open () na py 3.8
Vishesh Mangla

21

Pode ser um pouco exagerado, mas quando trabalho com ascii e unicode nos mesmos arquivos, a decodificação repetida pode ser uma dor, é isso que eu uso:

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

15

Adicionando a seguinte linha ao topo do seu arquivo .py:

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

permite codificar seqüências de caracteres diretamente em seu script, assim:

utfstr = "ボールト"

1
Não é o que o OP pede. Mas evite esses literais de string de qualquer maneira. Ele cria uma string Unicode no Python 3 (bom), mas é uma bytestring no Python 2 (ruim). Adicione from __future__ import unicode_literalsna parte superior ou use o u''prefixo. Não use caracteres não-ascii em bytesliterais. Para obter utf-8 bytes, você poderá utf8bytes = unicode_text.encode('utf-8')posteriormente, se necessário.
JFS

1
@jfs como vai from __future__ import unicode_literalsme ajudar a converter uma string com caracteres não-ascii para utf-8?
Ortal Turgeman 29/11

@OrtalTurgeman Não estou respondendo à pergunta. Olha, é um comentário, não uma resposta. Meu comentário aborda o problema com o código na resposta. Ele tenta criar uma bytestring com caracteres não-ascii no Python 2 (é um SyntaxError no Python de 3 bytes que os literais proíbem isso).
JFS

13

Se bem entendi, você tem uma string de bytes codificada utf-8 em seu código.

A conversão de uma sequência de bytes em uma sequência unicode é conhecida como decodificação (unicode -> byte-string é codificação).

Você faz isso usando a função unicode ou o método decode . Ou:

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

Ou:

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

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

8

No Python 3.6, eles não têm um método unicode () interno. As strings já estão armazenadas como unicode por padrão e nenhuma conversão é necessária. Exemplo:

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

3

Traduza com ord () e unichar (). Todo caractere unicode tem um número associado, algo como um índice. Portanto, o Python tem alguns métodos para traduzir entre um caractere e seu número. A desvantagem é um exemplo. Espero que possa ajudar.

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.