FAQ Python
FAQ PythonConsultez toutes les FAQ
Nombre d'auteurs : 11, nombre de questions : 188, dernière mise à jour : 14 juin 2021
- Quel est la différence entre une chaîne unicode et une chaîne normale ?
- Comment savoir si une chaîne de caractères est de type str ou unicode ?
- Comment convertir une chaîne normale en chaîne unicode ?
- Comment convertir une chaîne unicode en chaîne normale ?
- Comment connaître l'encodage par défaut des chaînes de caractères ?
Les chaînes normales décrites par le type str sont des chaînes d'octets qui peuvent être interprétées en connaissant leur encodage.
Ils en existent de nombreux comme l'ascii (7 bits) qui est l'encodage par défaut de Python, ISO-8859-1 (ou latin_1 sur 8 bits) pour les
langues occidentales, utf-8, utf-16, ...
Les chaînes unicode décrites par le type unicode permette de définir tout caractère existant où chaque caractère nécessite plusieurs
octets pour être codées (2 octets pour Python qui utilise unicode UCS2). Les chaînes unicode sont reconnaissables par la présence du caractère u
devant la chaîne.
Vous pouvez transformer une chaîne normale en chaîne unicode et vice versa.
La méthode isinstance( object, classinfo) renvoie True si l'objet object est une instance de la classe classinfo ou d'une classe dérivée.
a =
u'a
\xe2
'
print
isinstance(
a, unicode) ## True
Si vous avez une chaîne normale dont vous connaissez l'encodage, vous pouvez la transformer en chaîne unicode par la fonction unicode( [object[,
encoding [, errors]]]) où object est la chaîne à convertir et encoding, l'encodage d'interprétation de object.
Vous pouvez également utiliser la méthode decode( [encoding[, errors]]) appliquée à un objet de type str
strutf8 =
'
\xc3\xa2\xc3\xa4\xc3\xa0\xc3\xa9\xc3\xa8\xc3\xab\xc3\xaa
'
## chaîne "âäàéèëê" encodée en utf-8
uni =
unicode(
strutf8, 'utf-8'
) ## uni = u'\xe2\xe4\xe0\xe9\xe8\xeb\xea'
uni2 =
strutf8.decode
(
'utf-8'
) ## uni2 = u'\xe2\xe4\xe0\xe9\xe8\xeb\xea'
Si vous utilisiez un autre encodage, vous pourriez obtenir une erreur (unicode(strutf8, 'ascii') génèrera une erreur) ou bien une
chaîne unicode ne décrivant par la chaîne spécifiée (unicode(strutf8, 'latin_1') ).
Si vous voulez convertir une chaîne de caractères non contenue dans une variable en chaîne unicode, vous pouvez directement le faire en rajoutant
en ajoutant le caractère u devant la chaîne
uni =
u"âäàéèëê"
## u'\xe2\xe4\xe0\xe9\xe8\xeb\xea'
Si vous avez une chaîne unicode, vous pouvez facilement la convertir en chaîne normale sous n'importe quel encodage (capable d'interpréter la chaîne unicode) avec la méthode appliquée à une chaîne unicode encode( [encoding[,errors]]) où encoding est l'encodage souhaité pour la chaîne normale créée.
a =
u'
\xe2\xe4\xe0\xe9\xe8\xeb\xea
'
a.encode
(
'utf-8'
) ## '\xc3\xa2\xc3\xa4\xc3\xa0\xc3\xa9\xc3\xa8\xc3\xab\xc3\xaa'
Les problèmes viennent souvent du fait que l'on définit des chaînes contenant des caractères spéciaux sans que l'on écrive ses caractères spéciaux avec un encodage spécifique (par exemple 'ä' au lieu de '\x84' dans l'encodage cp850). Vous pouvez connaître l'encodage par défaut dans lequel Python encodera vos chaînes contenant des caractères spéciaux par l'attribut sys.stdin.encoding et ainsi facilement la convertir en chaîne unicode.
import
sys
print
sys.stdin.encoding ## cp1252 sous IDLE, cp850 sous la console Python
machaine =
'äâ'
## machaine est une chaîne encodée selon l'encodage sys.stdin.encoding
unicode(
machaine, sys.stdin.encoding) ## u'\xe4\xe2'
Ainsi la fenêtre interactive d'IDLE utilise l'encodage cp1252, la console interactive Python l'encodage cp850