Que dois-je faire en Python pour savoir quel encodage ?
Réponses
Trop de publicités?Il suffit de ne
type(s)
On va dire unicode
, les autres vont dire str
.
Vous pouvez les gérer séparément à l'aide d' isinstance
, par exemple
if isinstance(s, str):
print 's is a string object'
elif isinstance(s, unicode):
print 's is a unicode object'
Ou voulez-vous dire que vous avez un str
, et vous êtes à essayer de comprendre si il est codé à l'aide d' ASCII
ou UTF-8
ou quelque chose d'autre?
Dans ce cas, essayez ceci:
s.decode('ascii')
si une exception est levée, la chaîne n'est pas à 100% ASCII.
En python 3.x toutes les chaînes sont des séquences de caractères Unicode. et faire la vérification isinstance pour unicode devrait suffire.
En ce qui concerne les python 2.x, la plupart des gens semblent utiliser un if instruction qui a deux contrôles. un pour str et l’autre pour unicode.
Si vous voulez vérifier si vous avez un objet « chaîne » tout avec une seule instruction, cependant, vous pouvez procéder comme suit :
Unicode n’est ne pas un encodage - pour citer Kumar McMillan :
Si d’autres chaînes d’octets ASCII et UTF-8 sont « texte »...
.. .alors Unicode est « texte-ness » ;
C’est la forme abstraite du texte
Avoir une lecture de McMillan Unicode en Python, totalement démystifié parler de PyCon 2008, il explique les choses beaucoup mieux que la plupart des réponses connexes sur Stack Overflow.
Si votre code doit être compatible avec les deux Python 2 et Python 3, vous ne pouvez pas utiliser directement des choses comme isinstance(s,bytes)
ou isinstance(s,unicode)
sans emballage, soit try/except ou un python version d'essai, parce qu' bytes
n'est pas défini en Python 2 et unicode
n'est pas défini dans Python 3.
Il y a des moches, des solutions de contournement. Un très laide est de comparer le nom du type, au lieu de comparer le type lui-même. Voici un exemple:
# convert bytes (python 3) or unicode (python 2) to str
if str(type(s)) == "<class 'bytes'>":
# only possible in Python 3
s = s.decode('ascii') # or s = str(s)[2:-1]
elif str(type(s)) == "<type 'unicode'>":
# only possible in Python 2
s = str(s)
Un sans doute un peu moins moche solution de contournement consiste à vérifier la version de Python numéro, par exemple:
if sys.version_info >= (3,0,0):
# for Python 3
if isinstance(s, bytes):
s = s.decode('ascii') # or s = str(s)[2:-1]
else:
# for Python 2
if isinstance(s, unicode):
s = str(s)
Ceux qui sont à la fois unpythonic, et la plupart du temps il s'agit probablement d'une meilleure façon.