library - python soup find
Extracción de punto de código de Python y Unicode (4)
En Python API, ¿hay alguna manera de extraer el punto de código Unicode de un solo carácter?
Editar: en caso de que importe, estoy usando Python 2.7.
Resulta que obtener este derecho es bastante complicado: Python 2 y Python 3 tienen algunos problemas sutiles al extraer puntos de código Unicode de una cadena.
Hasta Python 3.3, fue posible compilar Python en uno de dos modos:
-
sys.maxunicode == 0x10FFFF
En este modo, las cadenas Unicode de Python admiten todo el rango de puntos de código Unicode desde U + 0000 a U + 10FFFF. Un punto de código está representado por un elemento de cadena:
>>> import sys
>>> hex(sys.maxunicode)
''0x10ffff''
>>> len(u''/U0001F40D'')
1
>>> [c for c in u''/U0001F40D'']
[u''/U0001f40d'']
Este es el valor predeterminado para Python 2.7 en Linux, así como universalmente en Python 3.3 y posteriores en todos los sistemas operativos.
-
sys.maxunicode == 0xFFFF
En este modo, las cadenas Unicode de Python solo admiten el rango de puntos de código Unicode desde U + 0000 a U + FFFF. Cualquier punto de código de U + 10000 a U + 10FFFF se representa utilizando un par de elementos de cadena en la codificación UTF-16 ::
>>> import sys
>>> hex(sys.maxunicode)
''0xffff''
>>> len(u''/U0001F40D'')
2
>>> [c for c in u''/U0001F40D'']
[u''/ud83d'', u''/udc0d'']
Este es el valor predeterminado para Python 2.7 en macOS y Windows.
Esta diferencia de tiempo de ejecución hace que escribir módulos de Python para manipular cadenas Unicode como series de puntos de código sea bastante inconveniente.
El módulo de puntos de código
Para resolver esto, contribuí con un nuevo módulo de codepoints
de codepoints
para PyPI
:
https://pypi.python.org/pypi/codepoints/1.0
Este módulo resuelve el problema al exponer las API para convertir cadenas Unicode hacia y desde listas de puntos de código, independientemente de la configuración subyacente para 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''
Si entiendo tu pregunta correctamente, puedes hacer esto.
>>> s=''㈲''
>>> s.encode("unicode_escape")
b''//u3232''
Muestra el código de escape Unicode como una cadena fuente.
Usualmente, solo haces ord(character)
para encontrar el punto de código de un personaje. Sin embargo, para completar, los caracteres anchos en el plano multilingüe suplementario Unicode se representan como pares de sustitución (es decir, dos unidades de código) en construcciones de Python estrechas, por lo que en ese caso a menudo tuve que hacer esta pequeña solución:
def get_wide_ordinal(char):
if len(char) != 2:
return ord(char)
return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00)
Sin embargo, esto es raro en la mayoría de las aplicaciones, por lo que solo ord()
usar ord()
.
>>> 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