utf8 saber minusculas minuscula metodo mayusculas mayuscula determinar convertir python unicode python-2.x case-sensitive uppercase

python - saber - ¿Cómo puedo convertir Unicode en mayúsculas para imprimirlo?



metodo capitalize python (5)

Creo que es tan simple como no convertir primero a ASCII.

>>> print u''exámple''.upper() EXÁMPLE

Tengo esto:

>>> print ''example'' example >>> print ''exámple'' exámple >>> print ''exámple''.upper() EXáMPLE

Lo que necesito hacer para imprimir:

EXÁMPLE

(Donde la ''a'' obtiene su acento agudo, pero en mayúsculas).

Estoy usando Python 2.6.


Creo que hay un poco de fondo que nos falta aquí:

>>> type(''hello'') <type ''str''> >>> type(u''hello'') <type ''unicode''>

Siempre que use cadenas "unicode" en lugar de cadenas "nativas", los operadores como upper () operarán teniendo en cuenta unicode. FWIW, Python 3 usa unicode por defecto, lo que hace la distinción en gran medida irrelevante.

Tomar una cadena de unicode a str y luego de regreso a unicode es subóptimo de muchas maneras, y muchas bibliotecas producirán salida unicode si lo desea; así que intente usar solo objetos unicode para cadenas internas cada vez que pueda.


En python 2.x, simplemente convierta la cadena a unicode antes de llamar a upper (). Usando su código, que está en formato utf-8 en esta página web:

>>> s = ''exámple'' >>> s ''ex/xc3/xa1mple'' # my terminal is not utf8. c3a1 is the UTF-8 hex for á >>> s.decode(''utf-8'').upper() u''EX/xc1MPLE'' # c1 is the utf-16 aka unicode for á

La llamada a la decode lleva de su formato actual a unicode. A continuación, puede convertirlo a algún otro formato, como utf-8, mediante el uso de codificación. Si el carácter estaba en, por ejemplo, iso-8859-2 (checo, etc., en este caso), en su lugar usaría s.decode(''iso-8859-2'').upper() .

Como en mi caso, si su terminal no es compatible con unicode / utf-8, lo mejor que puede esperar es una representación hexadecimal de los caracteres (como la mía) o convertirla de forma deshonesta con s.decode(''utf-8'').upper().encode(''ascii'', ''replace'') , que da como resultado ''EX? MPLE''. Si no puede hacer que su terminal muestre unicode, escriba la salida en un archivo en formato utf-8 y ábralo en su editor favorito.


Intentalo:

s = ''exámple'' print unicode(s).upper()


primero, solo uso Python 3.1 en estos días; su mérito central es tener cadenas de bytes desambiguadas de objetos Unicode. esto hace que la gran mayoría de las manipulaciones de texto sean mucho más seguras de lo que solían ser. sopesando los trillones de preguntas de los usuarios sobre los problemas de codificación de python 2.x, la convención u''äbc de python 2.1 fue solo un error; con bytes explícitos y bytearray , la vida se vuelve mucho más fácil.

en segundo lugar, si py3k no es de su agrado, intente ir from __future__ import unicode_literals , ya que esto imitará el comportamiento de py3k en python 2.6 y 2.7. esto hubiera evitado el error (fácilmente cometido) que cometió al decir print ''exámple''.upper() . esencialmente, esto es lo mismo que en py3k: print( ''exámple''.encode( ''utf-8'' ).upper() ) . compare estas versiones (para py3k):

print( ''exámple''.encode( ''utf-8'' ).upper() ) print( ''exámple''.encode( ''utf-8'' ).upper().decode( ''utf-8'' ) ) print( ''exámple''.upper() )

El primero es, básicamente, lo que hizo cuando utilizó una cadena ''exámple'' , siempre que establezca su codificación predeterminada en utf-8 (de acuerdo con una declaración BDFL, establecer la codificación predeterminada en tiempo de ejecución es una mala idea, por lo tanto, py2 tendrá que engañarlo diciendo import sys; reload( sys ); sys.setdefaultencoding( ''utf-8'' ) ; presento una mejor solución para py3k a continuación). cuando miras la salida de estas tres líneas:

b''EX/xc3/xa1MPLE'' EXáMPLE EXÁMPLE

se puede ver que cuando upper() se aplicó al primer texto, actuó en bytes, no en caracteres. python permite el método upper() en bytes, pero solo está definido en la interpretación US-ASCII de bytes. ya que utf-8 usa valores dentro de 8 bits, pero fuera de US-ASCII (128 hasta 255, que no son utilizados por US-ASCII), esos no se verán afectados por la parte upper() , por lo que cuando decodificamos en la segunda línea, obtenemos esa minúscula á . finalmente, la tercera línea lo hace bien, y sí, sorpresa, python parece ser consciente de que Á es la letra mayúscula correspondiente a á . Ejecuté una prueba rápida para ver qué caracteres Python 3 no convierte entre mayúsculas y minúsculas:

for cid in range( 3000 ): my_chr = chr( cid ) if my_chr == my_chr.upper() and my_chr == my_chr.lower(): say( my_chr )

leer detenidamente la lista revela muy pocas incidencias de letras latinas, cirílicas o griegas; la mayor parte del resultado es caracteres y signos de puntuación no europeos. los únicos caracteres que pude encontrar que Python salió mal son Ԥ / ԥ (/ u0524, / u0525, ''cirílico {capital | pequeño} letra pe con descendente''), siempre y cuando permanezcas fuera de los bloques Latin Extended-X ( echa un vistazo a esos, podrían dar sorpresas), en realidad podrías usar ese método. por supuesto, no verifiqué la exactitud de las asignaciones.

Por último, esto es lo que puse en la sección de inicio de mi aplicación py3k: un método que redefine la codificación sys.stdout ve, con referencias numéricas de caracteres (NCR) como respaldo; esto tiene el efecto de que imprimir a la salida estándar nunca generará un error de codificación de Unicode. cuando trabajo en ubuntu, _sys.stdout.encoding es utf-8 ; cuando el mismo programa se ejecuta en Windows, puede ser algo pintoresco como cp850 . la salida puede parecer starnge, pero la aplicación se ejecuta sin generar una excepción en esos terminales poco claros.

#=========================================================================================================== # MAKE STDOUT BEHAVE IN A FAILSAFE MANNER #----------------------------------------------------------------------------------------------------------- def _harden_stdout(): """Ensure that unprintable output to STDOUT does not cause encoding errors; use XML character references so any kind of output gets a chance to render in a decipherable way.""" global _sys_TRM _sys.stdout = _sys_TRM = _sys_io.TextIOWrapper( _sys.stdout.buffer, encoding = _sys.stdout.encoding, errors = ''xmlcharrefreplace'', line_buffering = true ) #........................................................................................................... _harden_stdout()

Un consejo más: al probar, siempre intente print repr( x ) o algo similar que revele la identidad de x . todo tipo de malentendidos pueden surgir si solo print x en py2 x es una cadena de octetos o un objeto Unicode. es muy desconcertante y propenso a causar muchos rasguños en la cabeza. como ya he dicho, intente mover al menos a py26 con el de un hechizo de literales unicode de importación futura.

y para cerrar, citando una cita: "Glyph Lefkowitz lo dice mejor en su artículo Encoding :

Creo que en el contexto de esta discusión, el término "cadena" no tiene sentido. Hay texto y hay datos orientados a bytes (que bien pueden representar texto, pero aún no se han convertido en él). En los tipos de Python, el texto es unicode. Los datos son str. La idea de "texto no Unicode" es solo un error de programación que está por ocurrir ".

actualización: acaba de encontrar que python 3 convierte correctamente s LETRA PEQUEÑA LETRA LONG S a S cuando está en mayúscula. ¡ordenado!