Blame platform-demos/es/strings.py.page

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>