/ / Transform ascii para unicode - python, utf-8

Transformar ascii em unicode - python, utf-8

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 № 1

Sua 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 e utf-8 são coisas diferentes. UMA str 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 requer unicode (por exemplo, para encode() 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:

  1. Sanduíche Unicode: Converte todo o texto para Unicode assim que ele é lido, trabalhe com unicode cordas e codificar de volta para um utf8 str apenas para escrevê-lo novamente.

  2. Os pandas ainda devem apoiar o encoding argumento para to_csv(), mesmo no Python 2. Use-o para gravar seus arquivos utf8.

  3. Para ler um arquivo diretamente, use codecs.open() em vez de simples open() para ler arquivos. Aceita o encoding= 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 ...).