Pergunta

pitão, as cordas podem ser Unicode (ambos utf-16 e utf-8) e de byte único com diferentes codificações (CP1251, CP1252 etc). É possível verificar o que seqüência de codificação é? Por exemplo,

time.strftime( "%b" )

irá retornar uma string com o nome de texto de um mês. Sob MacOS retornou seqüência será utf-16, no Windows com Inglês local será byte único com codificação ascii, e sob Windows com não-Inglês locale será codificado via página de códigos do locale, por exemplo CP1251. Como posso lidar com essas cordas?

Foi útil?

Solução

Strings não armazena nenhuma informação de codificação, você apenas tem que especificar um quando você converter de / para unicode ou imprimir para um dispositivo de saída:

import locale
lang, encoding = locale.getdefaultlocale()
mystring = u"blabla"
print mystring.encode(encoding)

UTF-8 é não unicode, é uma codificação de unicode em strings de byte único.

A melhor prática é trabalhar com unicode em todos os lugares no lado do python, armazenar as cordas com uma codificação reversível unicode, como UTF-8, e convertido para locais extravagantes apenas para saída de usuário.

Outras dicas

de conjunto de caracteres de codificação de detecção é muito complexo.

No entanto, qual é o seu propósito real para isso? se você quiser apenas para o valor de estar em unicode, basta escrever

unicode(time.strftime("%b"))

e ele deve funcionar para todos os casos que você mencionou acima:

  • mac: unicode (Unicode) -> unicode
  • ganhar / eng: unicode (ascii) -> unicode
  • ganhar / noneng: unicode (some_cp) -> será convertido por cp locais -> unicode

Se você tem uma razoavelmente longa seqüência em uma codificação desconhecida, você pode tentar adivinhar a codificação, por exemplo, com o Detector Universal Encoding em https://github.com/dcramer/chardet - não infalível de claro, mas às vezes acerta ;-). Mas isso não vai ajudar muito com cordas muito curtos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top