utf8 open error python unicode

python - open - ¿Debo usar cadena Unicode de forma predeterminada?



python unicode to utf8 (6)

Adicional al comentario de Mihails, diría: Use Unicode, ya que es el futuro. En Python 3.0, Non-Unicode se habrá ido, y por lo que sé, todos los "U" -Prefixes causarán problemas, ya que también se han ido.

¿Se considera una buena práctica seleccionar cadena Unicode sobre cadena normal cuando se codifica en Python? Principalmente trabajo en la plataforma de Windows, donde la mayoría de los tipos de cadenas son Unicode en estos días (es decir .NET String, ''_UNICODE'' activado por defecto en un nuevo proyecto de C ++, etc.). Por lo tanto, tiendo a pensar que el caso donde se usan objetos de cadenas no Unicode es una especie de caso raro. De todos modos, tengo curiosidad sobre lo que hacen los practicantes de Python en proyectos del mundo real.


Al hacer esta pregunta, supongo que está utilizando Python 2.x.

Python 3.0 cambió bastante en la representación de cadenas, y ahora todo el texto es unicode.
Me gustaría ir a Unicode en cualquier proyecto nuevo, de una manera compatible con el cambio a Python 3.0 (ver detalles ).


Desde mi práctica, usa unicode.

Al comienzo de un proyecto usamos cadenas habituales, sin embargo nuestro proyecto crecía, estábamos implementando nuevas características y usando nuevas bibliotecas de terceros. En ese lío con cadena no unicode / unicode, algunas funciones comenzaron a fallar. Empezamos a dedicar tiempo a localizar estos problemas y solucionarlos. Sin embargo, algunos módulos de terceros no admiten Unicode y comenzaron a fallar después de que cambiamos a él (pero esto es más bien una exclusión que una regla).

También tengo algo de experiencia cuando necesitábamos reescribir algunos módulos de terceros (por ejemplo, SendKeys) porque no eran compatibles con Unicode. Si se hizo en Unicode desde el principio, será mejor :)

Así que creo que hoy deberíamos usar unicode.

PD: todo lo que ensucia hacia arriba es solo mi opinión improvisada :)


Sí, usa unicode

Algunos consejos:

  1. Al hacer una salida de entrada en cualquier tipo de formato binario, decodifique directamente después de leer y codificar directamente antes de escribir, de modo que nunca necesite mezclar cadenas y unicode. Porque mezclar eso tiende a llevar a UnicodeEncodeDecodeErrors tarde o temprano.

  2. [Olvídate de este, mis explicaciones lo hicieron aún más confuso. Solo es un problema cuando se transfiere a Python 3, entonces puede preocuparse por eso.]

  3. Errores comunes de principiante de Python con Unicode (no diciendo que eres un novato, pero esto puede ser leído por los novatos): No confundas el codificar y descodificar. Recuerde, UTF-8 es una codificación, por lo que codificará Unicode a UTF-8 y DEcode a partir de él.

  4. No caiga en la tentación de establecer la codificación predeterminada en Python (por setdefaultencoding en sitecustomize.py o similar) a lo que más usa. Eso solo le dará problemas si reinstala o se traslada a otra computadora o de repente necesita usar otra codificación. Ser explícito

  5. Recuerde, no toda la biblioteca estándar de Python 2s acepta unicode. Si alimenta un método Unicode y no funciona, pero debería, intente alimentarlo como ASCII y vea. Ejemplos: urllib.urlopen (), que falla con errores inútiles si le das un objeto Unicode en lugar de una cadena.

Hm. ¡Eso es todo lo que puedo pensar ahora!


Si está tratando con memoria o espacio en disco severamente restringido, use cadenas ASCII. En este caso, también debe escribir su software en C o algo aún más compacto :)


Puede ser complicado utilizar cadenas unicode de manera consistente en Python 2.x, ya sea porque alguien inadvertidamente usa el str(blah) más natural str(blah) donde quieren decir unicode(blah) , olvidando el prefijo u en literales de cadena, incompatibilidades de módulos de terceros. lo que sea. Por lo tanto, en Python 2.x, use Unicode solo si es necesario y está preparado para proporcionar una buena cobertura de prueba de unidad.

Sin embargo, si tiene la opción de usar Python 3.x, no necesita preocuparse: las cadenas serán unicode sin esfuerzo adicional.