
Envoyé par
tyrtamos
Je trouve cependant curieux que vous ne placiez pas l'utf-8 dans l'Unicode, alors qu'il est décrit dans la norme ISO/CEI 10646 (
http://fr.wikipedia.org/wiki/ISO/CEI_10646), considérée comme un sous-ensemble de l'Unicode.
Je ne dis pas qu'utf-8 n'est pas défini dans la norme ISO, mais qu'il ne faut pas confondre les différentes couches de la norme. Une chaîne unicode ce n'est pas la même chose qu'une suite de bytes contenant la représentatin utf-8 de cette chaîne.
Mais le vrai problème, ici, c'est que l'utf-8 est multi-octets au delà de la partie commune avec l'ASCII (0 => 127), alors qu'il est traité dans Python 2.x comme un type 'str', c'est à dire comme tous les codecs "1 caractère = 1 octet". C'est en cela qu'il y a ambigüité: ça ressemble à un codec mono-octet, mais ce n'en est pas un...
Je suis d'accord que la situation en 2.x n'est pas idéale; il faut réaliser qu'en 2.x, un caractère ne fait pas toujours un octet. Ambigu, cela veut dire qu'il y a plusieurs façon de le comprendre, ce qui n'est pas le cas il me semble. Mais c'est vrai que cela n'est pas intuitif. Et le fait qu'il y ait une méthode encode sur le type str en Python 2.x est aberrant. Seul le type unicode devrait posséder cette méthode. De même, le type unicode ne devrait pas avoir de méthode decode. Cela n'a pas de sens et est source de confusion.
La morale c'est que si on est confronté au problème, la seule bonne solution est de décoder la chaîne en unicode (type 'unicode' en Python 2.x) dès que possible, faire tout le traitement en unicode, et retransformer en str le plus tard possible. Le principal mérite de Python 3.x, à ce niveau, est de faciliter cette démarche et de la rendre en partie obligatoire.

Envoyé par
Luke spywoker
Que faut il que je fasse pour obtenir la valeur utf-8 complète comme occurence de mon tableau et non un résultat scinder.
- Convertir en unicode (méthode "decode", ou si on lit la chaîne depuis un fichier, utiliser codecs.open ou io.open en précisant un codec de manière à récupérer directement une chaîne unicode)
- Splitter la chaîne (ou appliquer tout autre traitement) en unicode
- reconvertir en utf-8 après (méthode "encode", ou de nouveau en utilisant codecs.open ou io.open).
Exemple:
1 2 3 4 5 6 7 8 9
|
>>> s = "abcéèçàù"
>>> len(s)
13
>>> ss = s.decode('utf8')
>>> len(ss)
8
>>> [c.encode('utf8') for c in ss]
['a', 'b', 'c', '\xc3\xa9', '\xc3\xa8', '\xc3\xa7', '\xc3\xa0', '\xc3\xb9'] |
Le résultat n'est correct que parce que mon éditeur/interpréteur utilise bien de l'utf8, sinon il faut changer le codec utilisé dans "s.decode".
Le fait de déclarer un encodage en début de fichier permet à Python d'interpréter correctement les litéraux unicode comme u"abcéèçàù". Mais bien sûr il faut mettre le bon encodage, celui qui est vraiment utilisé par l'éditeur.
Ecrire:
1 2
| # -*- coding: utf8 -*-
s = u"abcéèçàù" |
donne le même résultat que:
s = "abcéèçàù".decode('utf8')
Partager