2010-02-23 13 views
9

Quiero transformar cadenas UTF-8 usando funciones incorporadas como upper() y capitalize().UTF-8 y superior()

Por ejemplo:

>>> mystring = "işğüı" 
>>> print mystring.upper() 
Işğüı # should be İŞĞÜI instead. 

¿Cómo puedo solucionar este problema?

Respuesta

14

No realizar acciones en cadenas codificadas; decodificar a unicode primero.

>>> mystring = "işğüı" 
>>> print mystring.decode('utf-8').upper() 
IŞĞÜI 
+1

La salida producida por esta respuesta (IŞĞÜI, comenzando con U + 0049 LETRA MAYÚSCULA LETRA I) es diferente de la salida correcta proporcionada por la pregunta (İŞĞÜI, comenzando con U + 0130 LETRA MAYÚSCULA LATINA I CON PUNTO ARRIBA). – thomasd

9

En realidad es mejor, como estrategia general, mantener siempre su texto como Unicode vez que está en la memoria: decodificarlo en el momento en que es de entrada, y codificar exactamente en el momento en que se necesita para la producción, si hay requisitos de codificación específicos en los tiempos de entrada y/o entrada.

Incluso si no elige adoptar esta estrategia general (¡y debería hacerlo!), La única forma de sonido para realizar la tarea que necesita es decodificar, procesar, codificar de nuevo, nunca trabajar en el codificado formas. Es decir .:

mystring = "işğüı" 
print mystring.decode('utf-8').upper().encode('utf-8') 

asumiendo que está restringido a cadenas codificadas en la asignación y para fines de salida. (La restricción de salida es lamentablemente realista, la restricción de asignación no es - solo haga mystring = u"işğüı", por lo que es unicode desde el principio, y aléjese al menos la llamada .decode! -)

+3

La misma estrategia es una buena idea para las fechas/horas. Convierta a UTC (o al menos TZ consciente) tan pronto como se ingrese y regrese a la zona horaria correcta cuando se emita. Esto resuelve un montón de problemas con las diferentes zonas horarias y el horario de verano. –

+0

@gnibbler: buen punto, estoy de acuerdo. Y para muchos cálculos financieros, convertir la entrada de inmediato en decimal (en lugar de aceptar flotantes predeterminados) puede evitar muchas pesadillas contables "¿dónde desapareció este centavo?" ;-). –