2010-09-20 5 views
3

Lors de l'impression d'une chaîne mise en forme d'une longueur fixe (par exemple, %20s), la largeur diffère de la chaîne de caractères UTF-8 à une chaîne normale:formatage de chaîne Python + comportement étrange UTF-8

>>> str1="Adam Matan" 
>>> str2="אדם מתן" 
>>> print "X %20s X" % str1 
X   Adam Matan X 
>>> print "X %20s X" % str2 
X  אדם מתן X 

Notez la différence :

X   Adam Matan X 
X  אדם מתן X 

Des idées?

+1

Punaise python? ....;) – sje397

Répondre

7

Vous devez spécifier que la deuxième chaîne est Unicode en mettant u en face de la chaîne:

>>> str1="Adam Matan" 
>>> str2=u"אדם מתן" 
>>> print "X %20s X" % str1 
X   Adam Matan X 
>>> print "X %20s X" % str2 
X    אדם מתן X 

Faire cela permet de Python savoir que qu'il compte Unicode caractères, pas seulement des octets.

+0

+1 pour une bonne explication. Peut vouloir vérifier ce tutoriel pour une meilleure compréhension http://sebsauvage.net/python/snyppets/#unicode – rubayeet

1

Essayez de cette façon:

>>> str1="Adam Matan" 
>>> str2=unicode("אדם מתן", "utf8") 
>>> print "X %20s X" % str2 
X    אדם מתן X 
>>> print "X %20s X" % str1 
X   Adam Matan X 
+0

+1 pour la fonction 'unicode' –

3

En Python 2, les littéraux de chaîne non préfixés sont de type str, qui est une chaîne . Il stocke des octets arbitraires, pas des caractères. UTF-8 encode certains caractères avec plus d'un octet. str2 contient donc plus d'octets que de caractères réels et affiche le comportement inattendu, mais parfaitement valide, dans la mise en forme des chaînes. Si vous regardez le byte byte contenu de ces chaînes (utilisez repr au lieu de print), vous verrez, que dans les deux chaînes le champ est en réalité 20 octets (pas les caractères!) De long.

Comme déjà mentionné, la solution consiste à utiliser des chaînes Unicode. Lorsque vous travaillez avec des chaînes en Python, vous devez absolument comprendre et réaliser la différence entre les chaînes Unicode et Octet.

+0

+1 Pour une explication approfondie –