2009-07-12 12 views
19

¿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.¿Debo usar cadena Unicode de forma predeterminada?

Respuesta

17

De mi práctica: use unicode.

Al comienzo de un proyecto usamos cadenas habituales, sin embargo nuestro proyecto crecía, estábamos implementando nuevas características y utilizando 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.

P.S. Todo lo que ensucia hacia arriba es solo mi opinión improvisada :)

+2

+1: utilice siempre Unicode cuando maneja texto. Siempre que surja la necesidad de tratar los datos de texto como bytes (por ejemplo, al pasar por la red o escribir en el disco), convierta el Unicode en una secuencia de bytes (representada como una cadena en Python). Convierte llamando codificación o unicode. – codeape

2

Si se trata de una memoria muy limitada o espacio en disco, use cadenas ASCII. En este caso, también debe escribir su software en C o algo aún más compacto :)

13

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 (vea details).

+0

Sí, ¡la compatibilidad futura es bastante importante! –

4

Comentario adicional a 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.

5

Puede ser difícil de usar consistentemente cadenas Unicode en Python 2.x - ya sea porque alguien inadvertidamente utiliza la más natural str(blah), donde se referían unicode(blah), olvidando el prefijo u en los literales de cadena, incompatibilidades módulo 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 utilizar Python 3.x, no necesita preocuparse: las cadenas serán unicode sin esfuerzo adicional.

13

Sí, use unicode.

Algunos consejos:

  1. Al hacer de entrada y salida en cualquier tipo de formato binario, decodificar directamente después de leer y codificar directamente antes de escribir, por lo que nunca se necesita mezclar cuerdas 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 principiantes de Python con Unicode (no diciendo que eres un novato, pero esto puede ser leído por los novatos): No confundas la codificación y la decodificación. 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 la que más utiliza. 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!

+0

El punto 3 es muy cierto: todos los que conozco (incluyéndome a mí) cometieron este error, ¡y no solo una vez! –

+1

Re: "codificar directamente después de escribir" - ¿puedes aclarar? Creo que debería ser "antes" en lugar de "después", pero podría estar perdiendo tu punto. – ars

+0

@Lennart: "Tenga en cuenta que incluso si después de codificar unicode en una cadena llena de texto no ascii, esto sigue siendo texto, de acuerdo con Python". ... En 3.x, str.encode() devuelve bytes tipo, y la distinción ascii o no parece irrelevante; ¿Cuál es el punto que estás tratando de hacer? –

Cuestiones relacionadas