Pregunta

En python, las cadenas pueden ser unicode (tanto utf-16 como utf-8) y un solo byte con diferentes codificaciones (cp1251, cp1252, etc.). ¿Es posible verificar qué cadena de codificación es? Por ejemplo,

time.strftime( "%b" )

devolverá una cadena con el nombre de texto de un mes. En MacOS, la cadena devuelta será utf-16, en Windows con inglés local, será de un solo byte con codificación ascii, y en Windows con un idioma que no sea inglés, se codificará a través de la página de códigos del idioma, por ejemplo cp1251. ¿Cómo puedo manejar tales cadenas?

¿Fue útil?

Solución

Las cadenas no almacenan ninguna información de codificación, solo tiene que especificar una cuando convierte a / desde unicode o imprime a un dispositivo de salida:

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

UTF-8 es no unicode, es una codificación de unicode en cadenas de un solo byte.

La mejor práctica es trabajar con Unicode en todas partes en el lado de Python, almacenar sus cadenas con una codificación reversible de Unicode como UTF-8 y convertirlas a locales de lujo solo para la salida del usuario.

Otros consejos

la detección de la codificación del juego de caracteres es muy compleja.

sin embargo, ¿cuál es su verdadero propósito para esto? Si solo desea valorar estar en Unicode, simplemente escriba

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

y debería funcionar para todos los casos que has mencionado anteriormente:

  • mac os: unicode (unicode) - > Unicode
  • win / eng: unicode (ascii) - > Unicode
  • win / noneng: unicode (some_cp) - > será convertido por cp local > Unicode

Si tienes una cadena razonablemente larga en una codificación desconocida, puedes intentar adivinar la codificación, por ejemplo. con el Detector de codificación universal en https://github.com/dcramer/chardet - no es infalible Por supuesto, pero a veces acerta ;-). Pero eso no ayudará mucho con cuerdas muy cortas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top