296 votes

Comment puis-je vérifier si une chaîne est unicode ou ascii ?

Que dois-je faire en Python pour savoir quel encodage ?

314voto

Greg Hewgill Points 356191

Dans Python 3, toutes les chaînes sont des séquences de caractères Unicode. Il y a un `` type qui contient les octets bruts.

Dans Python 2, une chaîne peut être de type ou de type . Vous pouvez dire quelque chose comme ça qui en utilisant le code :

130voto

Mikel Points 10000

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.

48voto

ThinkBonobo Points 258

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 :

33voto

Alex Dean Points 3997

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.

24voto

Dave Burton Points 825

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X