|
Packit |
1470ea |
|
|
Packit |
1470ea |
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:e="http://projectmallard.org/experimental/" type="guide" style="task" id="strings.py" xml:lang="es">
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<info>
|
|
Packit |
1470ea |
<title type="text">Cadenas (Python)</title>
|
|
Packit |
1470ea |
<link type="guide" xref="beginner.py#theory"/>
|
|
Packit |
1470ea |
<link type="next" xref="label.py"/>
|
|
Packit |
1470ea |
<revision version="0.1" date="2012-06-16" status="draft"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<desc>Una explicación de cómo trabajar con cadenas en Python y GTK+.</desc>
|
|
Packit |
1470ea |
<credit type="author copyright">
|
|
Packit |
1470ea |
<name>Sebastian Pölsterl</name>
|
|
Packit |
1470ea |
<email its:translate="no">sebp@k-d-w.org</email>
|
|
Packit |
1470ea |
<years>2011</years>
|
|
Packit |
1470ea |
</credit>
|
|
Packit |
1470ea |
<credit type="editor">
|
|
Packit |
1470ea |
<name>Marta Maria Casetti</name>
|
|
Packit |
1470ea |
<email its:translate="no">mmcasetti@gmail.com</email>
|
|
Packit |
1470ea |
<years>2012</years>
|
|
Packit |
1470ea |
</credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>Daniel Mustieles</mal:name>
|
|
Packit |
1470ea |
<mal:email>daniel.mustieles@gmail.com</mal:email>
|
|
Packit |
1470ea |
<mal:years>2011 - 2017</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>Nicolás Satragno</mal:name>
|
|
Packit |
1470ea |
<mal:email>nsatragno@gmail.com</mal:email>
|
|
Packit |
1470ea |
<mal:years>2012 - 2013</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>Jorge González</mal:name>
|
|
Packit |
1470ea |
<mal:email>jorgegonz@svn.gnome.org</mal:email>
|
|
Packit |
1470ea |
<mal:years>2011</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
</info>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<title>Cadenas</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<links type="section"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<note style="warning">GNOME recomienda fuertemente el uso de Python 3 para escribir aplicaciones. </note>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="python-2">
|
|
Packit |
1470ea |
<title>Cadenas en Python 2</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Python 2 viene con dos tipos de objetos diferentes que pueden usarse para representar cadenas, str y unicode . Las instancias de unicode se usan para expresar cadenas de Unicode, mientras que las instancias del tipo str son representaciones de bytes (la cadena codificada). A nivel funcional, Python representa las cadenas de Unicode como enteros de 16 ó 32 bits, dependiendo de cómo se compiló su intérprete.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
>>> unicode_string = u"Fu\u00dfb\u00e4lle"
|
|
Packit |
1470ea |
>>> print unicode_string
|
|
Packit |
1470ea |
Fußbälle
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Las cadenas de Unicode pueden convertirse a cadenas de 8 bits con unicode.encode() . Las cadenas de 8 bits de Python tienen un método str.decode() que interpreta la cadena usando la codificación dada (es decir, es la inversa de unicode.encode() ):
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
>>> type(unicode_string)
|
|
Packit |
1470ea |
<type 'unicode'>
|
|
Packit |
1470ea |
>>> unicode_string.encode("utf-8")
|
|
Packit |
1470ea |
'Fu\xc3\x9fb\xc3\xa4lle'
|
|
Packit |
1470ea |
>>> utf8_string = unicode_string.encode("utf-8")
|
|
Packit |
1470ea |
>>> type(utf8_string)
|
|
Packit |
1470ea |
<type 'str'>
|
|
Packit |
1470ea |
>>> unicode_string == utf8_string.decode("utf-8")
|
|
Packit |
1470ea |
True
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Desafortunadamente, Python 2.x le permite mezclar unicode y str si la cadena de 8 bits contuviera sólo bytes de 7 bits (ASCII), pero obtendría <sys>UnicodeDecodeError</sys> si contuviera valores no ASCII.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="python-3">
|
|
Packit |
1470ea |
<title>Cadenas en Python 3</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Desde Python 3.0, todas las cadenas se almacenan como Unicode en una instancia del tipo str . Las cadenas codificadas, por otro lado, se representan como datos binarios en la forma de instancias del tipo de bytes. Conceptualmente, str se refiere a texto, mientras que bytes se refieren a datos. Use encode() para ir de str a bytes , y decode() para ir de bytes a str .
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Además, ya no es posible mezclar cadenas de Unicode con cadenas codificadas, porque se producirá un TypeError :
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
>>> text = "Fu\u00dfb\u00e4lle"
|
|
Packit |
1470ea |
>>> data = b" sind rund"
|
|
Packit |
1470ea |
>>> text + data
|
|
Packit |
1470ea |
Traceback (most recent call last):
|
|
Packit |
1470ea |
File "<stdin>", line 1, in <module>
|
|
Packit |
1470ea |
TypeError: Can't convert 'bytes' object to str implicitly
|
|
Packit |
1470ea |
>>> text + data.decode("utf-8")
|
|
Packit |
1470ea |
'Fußbälle sind rund'
|
|
Packit |
1470ea |
>>> text.encode("utf-8") + data
|
|
Packit |
1470ea |
b'Fu\xc3\x9fb\xc3\xa4lle sind rund'
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="gtk">
|
|
Packit |
1470ea |
<title>Unicode en GTK+</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
GTK+ usa cadenas codificadas con UTF-8 para todo el texto. Esto significa que si llama a un método que devuelve una cadena, siempre obtendrá una instancia del tipo str . Lo mismo se aplica a métodos que esperan una o más cadenas como parámetro, deben estar codificadas con UTF-8. Sin embargo, por comodidad, PyGObject convertirá automáticamente cualquier instancia de Unicode a «str» si se proporciona como argumento:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
>>> from gi.repository import Gtk
|
|
Packit |
1470ea |
>>> label = Gtk.Label()
|
|
Packit |
1470ea |
>>> unicode_string = u"Fu\u00dfb\u00e4lle"
|
|
Packit |
1470ea |
>>> label.set_text(unicode_string)
|
|
Packit |
1470ea |
>>> txt = label.get_text()
|
|
Packit |
1470ea |
>>> type(txt)
|
|
Packit |
1470ea |
<type 'str'>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Además:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
>>> txt == unicode_string
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
devolvería False , con la advertencia __main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal (Gtk.Label.get_text() devolverá siempre una instancia de str ; por lo tanto, txt y unicode_string no son iguales).
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Esto es especialmente importante si quiere internacionalizar su programa usando <link href="http://docs.python.org/library/gettext.html">gettext </link>. Tiene que asegurarse de que gettext devuelva cadenas de 8 bits codificadas con UTF-8 para todos los idiomas.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
En general se recomienda no usar ningún objeto de unicode en aplicaciones de GTK+, y sólo usar objetos str codificados con UTF-8 dado que GTK+ no integra completamente objetos unicode .
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
En Python 3.x las codificación de cadenas es más consistente, porque PyGObject automáticamente codifica/decodifica hacia/desde UTF-8 si le pasa una cadena a un método o un método devuelve una cadena. Las cadenas, o el texto, siempre se representarán sólo como instancias de str .
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="references">
|
|
Packit |
1470ea |
<title>Referencias</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<link href="http://python-gtk-3-tutorial.readthedocs.org/en/latest/unicode.html">Cómo manejar cadenas: el tutorial de GTK+ 3 en Python</link>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</page>
|