240 votes

Comment vérifier si une chaîne en Python est en ASCII ?

Je me suis battu avec Python pour comprendre comment puis-je vérifier si une chaîne est au format ASCII ou non.

Je suis conscient de ord(), cependant lorsque j’essaie ord('é'), j’ai TypeError : ord() attend un caractère, mais une chaîne de longueur 2 trouvé. J’ai bien compris il est causé par la façon dont j’ai construit Python (comme expliqué dans la `` de documentation).

Donc ma question est simple : y a-t-il une autre façon de vérifier cela ?

276voto

Vincent Marchetti Points 2097

Je pense que vous n'êtes pas poser la bonne question--

Une chaîne de caractères en python n'a pas de propriété correspondant à 'ascii', utf-8, ou tout autre codage. La source de votre chaîne (si vous le lisez à partir d'un fichier d'entrée à partir d'un clavier, etc.) peut avez encodé une chaîne unicode en ascii pour produire votre chaîne, mais c'est là que vous devez aller pour une réponse.

Peut-être la question que vous pouvez poser est: "Est-ce de la chaîne, le résultat de l'encodage d'une chaîne unicode en ascii?" -- Ce que vous pouvez répondre à en essayant:

try:
    mystring.decode('ascii')
except UnicodeDecodeError:
    print "it was not a ascii-encoded unicode string"
else:
    print "It may have been an ascii-encoded unicode string"

219voto

Alexander Kojevnikov Points 9389
def is_ascii(s):
    return all(ord(c) < 128 for c in s)

18voto

Alvin Points 1128

Tombé sur quelque chose comme ceci récemment - pour un usage ultérieur

que vous pourriez utiliser avec :

18voto

Glyph Points 17756

Votre question est erronée; l'erreur que vous voyez n'est pas un résultat de la façon dont vous avez construit python, mais d'une confusion entre les chaînes d'octets et des chaînes unicode.

Chaînes d'octets (par exemple "toto", ou "bar", dans la syntaxe de python) sont des séquences d'octets; les nombres de 0 à 255. Des chaînes Unicode (par exemple, u"foo" ou u'bar') sont des séquences de points de code unicode; les numéros de 0-1112064. Mais vous avez l'air d'être intéressé par le caractère "é", qui (dans le terminal) est un multi-séquence d'octets qui représente un seul caractère.

Au lieu de ord(u'é'), essayez ceci:

>>> [ord(x) for x in u'é']

Que vous indique la séquence de points de code "é" représente. Il peut vous donner [233], ou il peut vous donner [101, 770].

Au lieu de chr() à inverser cette situation, il est unichr():

>>> unichr(233)
u'\xe9'

Ce caractère peut effectivement être représentée, que ce soit un seul ou plusieurs unicode "points de code", qui eux-mêmes représentent des graphèmes ou de caractères. C'est soit "e avec un accent aigu (c'est à dire, le point de code 233)", ou "e" (point de code 101), suivi par "un accent aigu sur le caractère précédent" (point de code 770). Donc, ce même personnage peut être présenté comme le Python structure de données u'e\u0301' ou u'\u00e9'.

La plupart du temps, vous ne devriez pas avoir à s'en préoccuper, mais il peut devenir un problème si vous êtes une itération sur une chaîne unicode, comme l'itération des œuvres de point de code, pas décomposable par caractère. En d'autres termes, len(u'e\u0301') == 2 et len(u'\u00e9') == 1. Si cela vous intéresse, vous pouvez convertir entre les compose et décompose les formes en utilisant unicodedata.normalize.

Le Glossaire Unicode peut être un guide utile à la compréhension de certaines de ces questions, en montrant comment chaque terme se réfère à une partie différente de la représentation d'un texte, qui est bien plus compliqué que de nombreux programmeurs de réaliser.

9voto

miya Points 533

Que diriez-vous faire cela ?

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