Blame platform-demos/fr/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="fr">
Packit 1470ea
Packit 1470ea
<info>
Packit 1470ea
  <title type="text">Strings (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>Une explication sur l'utilisation des chaînes de caractères dans Python et 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>Luc Rebert,</mal:name>
Packit 1470ea
      <mal:email>traduc@rebert.name</mal:email>
Packit 1470ea
      <mal:years>2011</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>Alain Lojewski,</mal:name>
Packit 1470ea
      <mal:email>allomervan@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011-2012</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>Luc Pionchon</mal:name>
Packit 1470ea
      <mal:email>pionchon.luc@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011</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>Bruno Brouard</mal:name>
Packit 1470ea
      <mal:email>annoa.b@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011-12</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>Luis Menina</mal:name>
Packit 1470ea
      <mal:email>liberforce@freeside.fr</mal:email>
Packit 1470ea
      <mal:years>2014</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
<title>Chaînes de caractères</title>
Packit 1470ea
Packit 1470ea
<links type="section"/>
Packit 1470ea
Packit 1470ea
<note style="warning">

GNOME strongly encourages the use of Python 3 for writing applications!

</note>
Packit 1470ea
Packit 1470ea
<section id="python-2">
Packit 1470ea
<title>Les chaînes de caractères dans Python 2</title>
Packit 1470ea
Packit 1470ea

Python 2 est livré avec deux types différents d'objets qui peuvent être utilisés pour représenter des chaînes : str et unicode. Les instances du type unicode sont utilisées pour exprimer des chaînes Unicode, alors que les exemples du type str sont des représentations d'octets (la chaîne codée). En interne, Python représente les chaînes Unicode par des entiers de 16 ou de 32 bits, en fonction du type de compilation de l'interpréteur Python.

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

Les chaînes Unicode peuvent être converties en 8 bits avec unicode.encode(). Les chaînes Python en 8 bits contiennent une méthode str.decode() qui interprète la chaîne avec le codage qui lui est attribué (c'est donc l'inverse 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

Malheureusement, Python 2.x vous permet de mélanger les types unicode et str s'il arrivait que la chaîne de 8 bits ne contienne que des octets de 7 bits (ASCII), mais retourne l'erreur <sys>UnicodeDecodeError</sys> si elle contient des valeurs qui ne sont pas ASCII.

Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="python-3">
Packit 1470ea
<title>Les chaînes dans Python 3</title>
Packit 1470ea
Packit 1470ea

Since Python 3.0, all strings are stored as Unicode in an instance of the str type. Encoded strings on the other hand are represented as binary data in the form of instances of the bytes type. Conceptually, str refers to text, whereas bytes refers to data. Use encode() to go from str to bytes, and decode() to go from bytes to str.

Packit 1470ea
Packit 1470ea

En plus, il n'est plus possible de mélanger des chaînes Unicode avec des chaînes codées, car cela retournerait une erreur 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 dans GTK+</title>
Packit 1470ea
Packit 1470ea

GTK+ utilise des chaînes au format UTF-8 pour tout ce qui est texte. Cela signifie que, si vous appelez une méthode qui renvoie une chaîne, vous obtenez toujours une représentation du type str. Cela s'applique également aux méthodes qui considèrent une ou plusieurs chaînes comme paramètres, elles doivent aussi être codées en UTF-8. Cependant, pour plus de souplesse, PyGObject convertit automatiquement n'importe quelle représentation Unicode au format str si vous lui donnez comme argument :

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

Furthermore:

Packit 1470ea
Packit 1470ea
Packit 1470ea
>>> txt == unicode_string]]>
Packit 1470ea
Packit 1470ea

devrait renvoyer False, avec l'avertissement __main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal (Gtk.Label.get_text() renvoie toujours une représentation str ; en conséquence, txt et unicode_string sont inégaux).

Packit 1470ea
Packit 1470ea

Cela est particulièrement important si vous voulez internationnaliser votre programme avec <link href="http://docs.python.org/library/gettext.html">gettext</link>. Vous devez vous assurer que gettext va renvoyer des chaînes codées en UTF-8 pour toutes les langues.

Packit 1470ea
Packit 1470ea

D'une manière générale, nous vous recommandons de ne pas du tout utiliser d'objets unicode dans les applications GTK+, mais seulement des objets str codés en UTF-8, car GTK+ n'intègre pas tous les objets unicode.

Packit 1470ea
Packit 1470ea

String encoding is more consistent in Python 3.x because PyGObject will automatically encode/decode to/from UTF-8 if you pass a string to a method or a method returns a string. Strings, or text, will always be represented as instances of str only.

Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="references">
Packit 1470ea
<title>Références</title>
Packit 1470ea
Packit 1470ea

<link href="http://python-gtk-3-tutorial.readthedocs.org/en/latest/unicode.html">How To Deal With Strings - The Python GTK+ 3 Tutorial</link>

Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
</page>