web-dev-qa-db-fra.com

Récupère le point de code unicode d'un caractère en utilisant Python

Dans Python API, existe-t-il un moyen d'extraire le point de code unicode d'un seul caractère?

Edit: Au cas où cela compte, j'utilise Python 2.7.

42
SK9
>>> ord(u"ć")
263
>>> u"café"[2]
u'f'
>>> u"café"[3]
u'\xe9'
>>> for c in u"café":
...     print repr(c), ord(c)
... 
u'c' 99
u'a' 97
u'f' 102
u'\xe9' 233
37
Mike Graham

Si je comprends bien votre question, vous pouvez le faire.

>>> s='㈲'
>>> s.encode("unicode_escape")
b'\\u3232'

Affiche le code d'échappement unicode sous forme de chaîne source.

49
Keith

Habituellement, vous faites simplement ord(character) pour trouver le point de code d'un caractère. Pour être complet cependant, les caractères larges dans le plan multilingue supplémentaire Unicode sont représentés comme des paires de substitution (c'est-à-dire deux unités de code) dans des constructions étroites Python, donc dans ce cas, j'avais souvent besoin de faire ce petit travail- autour:

def get_wide_ordinal(char):
    if len(char) != 2:
        return ord(char)
    return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00)

Ceci est cependant rare dans la plupart des applications, donc utilisez normalement ord().

10
cryo

Il s'avère que cela est assez délicat: Python 2 et Python 3 a quelques problèmes subtils avec l'extraction des points de code Unicode d'une chaîne).

Jusqu'à Python 3.3, il était possible de compiler Python dans l'un des deux modes:

  1. sys.maxunicode == 0x10FFFF

Dans ce mode, les chaînes Unicode de Python prennent en charge la gamme complète des points de code Unicode de U + 0000 à U + 10FFFF. Un point de code est représenté par un élément de chaîne:

>>> import sys
>>> hex(sys.maxunicode)
'0x10ffff'
>>> len(u'\U0001F40D')
1
>>> [c for c in u'\U0001F40D']
[u'\U0001f40d']

Il s'agit de la valeur par défaut pour Python 2.7 sur Linux, ainsi que universellement sur Python 3.3 et versions ultérieures sur tous les systèmes d'exploitation).

  1. sys.maxunicode == 0xFFFF

Dans ce mode, les chaînes Unicode de Python ne prennent en charge que la plage de points de code Unicode de U + 0000 à U + FFFF. Tous les points de code de U + 10000 à U + 10FFFF sont représentés à l'aide d'une paire d'éléments de chaîne dans le codage UTF-16 ::

>>> import sys
>>> hex(sys.maxunicode)
'0xffff'
>>> len(u'\U0001F40D')
2
>>> [c for c in u'\U0001F40D']
[u'\ud83d', u'\udc0d']

Il s'agit de la valeur par défaut pour Python 2.7 sur macOS et Windows.

Cette différence d'exécution rend l'écriture de modules Python pour manipuler les chaînes Unicode comme une série de points de code assez gênante.

Le module codepoints

Pour résoudre ce problème, j'ai contribué un nouveau module codepoints à PyPI:

https://pypi.python.org/pypi/codepoints/1.

Ce module résout le problème en exposant des API pour convertir des chaînes Unicode vers et depuis des listes de points de code, quel que soit le paramètre sous-jacent pour sys.maxunicode ::

>>> hex(sys.maxunicode)
'0xffff'
>>> snake = Tuple(codepoints.from_unicode(u'\U0001F40D'))
>>> len(snake)
1
>>> snake[0]
128013
>> hex(snake[0])
'0x1f40d'
>>> codepoints.to_unicode(snake)
u'\U0001f40d'
5
Ben Hamilton

python2

>>> print hex(ord(u'人'))
0x4eba
0
lookinghong