Eu não sou capaz de converter
"Schutztxc3xbcren".encode("utf-8")
o seguinte para unicode, mas não pode, obtendo o erro
UnicodeDecodeError: O codec "ascii" não pode decodificar o byte 0xc3 na posição 7: ordinal não está no intervalo (128)
Eu gostaria de ter
"Schutztüren"
como um resultado.
Respostas:
2 para resposta № 1Sua string já está em utf-8
. Você precisa decodificar para Unicode para usá-lo dentro do Python:
print "Schutztxc3xbcren".decode("utf-8")
Mas você tem um problema maior: Você está claramente usando o Python 2. Mude para o Python 3 imediatamente, não há motivo para ficar louco tentando entender a abordagem do Python 2 para lidar com as codificações de caracteres. Mude para o Python 3 e você não terá que bater a cabeça contra a mesa várias vezes ao dia. (Note que apesar de você estar ligando para encode()
método, você tem um
UnicodeDecodeError
.
Uma explicação simples:
- Em Python,
unicode
eutf-8
são coisas diferentes. UMAstr
em Python 2 pode estar no"utf-8"
codificação,unicode
objetos não têm codificação. - Se você tentar usar um
str
para algo que requerunicode
(por exemplo, paraencode()
ou vice-versa, o Python 2 tentará convertê-lo implicitamente primeiro. Exceto que não conhece a codificação de suas cordas, então adivinha (ascii
, no seu caso). Oops - O Python2 tem muitas conversões implícitas.
Mas, na verdade, o motivo é simples: você não está usando o Python 3.
Editar: Como o Python 3 não é uma opção, aqui estão alguns conselhos práticos:
Sanduíche Unicode: Converte todo o texto para Unicode assim que ele é lido, trabalhe com
unicode
cordas e codificar de volta para um utf8str
apenas para escrevê-lo novamente.Os pandas ainda devem apoiar o
encoding
argumento parato_csv()
, mesmo no Python 2. Use-o para gravar seus arquivosutf8
.Para ler um arquivo diretamente, use
codecs.open()
em vez de simplesopen()
para ler arquivos. Aceita oencoding=
argumento e lhe daráunicode
cordas.
1 para resposta № 2
Você precisa usar decode
Cadeia codificada utf-8 para unicode em vez disso.
"Schutztxc3xbcren".decode("utf-8")
0 para resposta № 3
em python 3 você precisa decode
a bytes
que são sua string codificada:
b"Schutztxc3xbcren".decode("utf-8")
em python 2 o b
não é necessário (aqui a distinção entre bytes e strings é menos rigorosa ...).