web-dev-qa-db-fra.com

Testez une chaîne si c'est Unicode, quelle est la norme UTF et obtenez sa longueur en octets?

J'ai besoin de tester si une chaîne est Unicode, puis si c'est UTF-8. Après cela, obtenez la longueur de la chaîne en octets, y compris BOM , s'il l'utilise jamais. Comment cela peut-il être fait en Python?

Aussi à des fins didactiques, à quoi ressemble une représentation sous forme de liste d'octets d'une chaîne UTF-8? Je suis curieux de voir comment une chaîne UTF-8 est représentée en Python.

Dernier montage: pprint le fait assez bien.

18
Eduard Florinescu
try:
    string.decode('utf-8')
    print "string is UTF-8, length %d bytes" % len(string)
except UnicodeError:
    print "string is not UTF-8"

Dans Python 2, str est une séquence d'octets et unicode est une séquence de caractères. Vous utilisez str.decode pour décoder une séquence d'octets en unicode et unicode.encode pour coder une séquence de caractères en str. Ainsi, par exemple, u"é" est la chaîne unicode contenant le caractère unique U + 00E9 et peut également s'écrire u"\xe9"; l'encodage en UTF-8 donne la séquence d'octets "\xc3\xa9".

Dans Python 3, cela est modifié; bytes est une séquence d'octets et str est une séquence de caractères.

26
ecatmur

Pour vérifier si Unicode

>>>a = u'F'
>>>isinstance(a, unicode)
True

Pour vérifier si c'est UTF-8 ou ASCII

>>>import chardet
>>>encoding = chardet.detect('AA')
>>>encoding['encoding']
'ascii'
5
Rakesh

Je recommanderais certainement le Joel Spolsky The Absolute Minimum Every Software Developer Absolutely, Positively Must Know about Unicode and Character Sets (No Excuses!) , si vous ne l'avez pas déjà lu.

Pour l'Unicode de Python et les machines de codage/décodage, démarrez ici . Pour obtenir la longueur d'octet d'une chaîne Unicode encodée en utf-8, vous pouvez faire:

print len(my_unicode_string.encode('utf-8'))

Votre question est balisée python-2.5, mais sachez que cela change quelque peu dans Python 3+.

2
thebjorn