/ / Python y extracción de puntos de código Unicode - Python, Unicode

Python y extracción de puntos de código Unicode - Python, Unicode

En la API de Python, ¿hay una 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.

Respuestas

27 para la respuesta № 1
>>> 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

33 para la respuesta № 2

Si entiendo su pregunta correctamente, puede hacerlo.

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

Muestra el código de escape de Unicode como una cadena de origen.


7 para la respuesta № 3

Normalmente 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 sustitutos (es decir, dos unidades de código) en construcciones Python estrechas, por lo que en ese caso a menudo tuve que hacer este pequeño trabajo alternativo:

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 normalmente solo se usa ord().


3 para la respuesta № 4

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, era posible compilar Python en uno de dos modos:

  1. sys.maxunicode == 0x10FFFF

En este modo, las cadenas Unicode de Python admiten el rango completo de puntos de código Unicode desde U + 0000 hasta 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.

  1. sys.maxunicode == 0xFFFF

En este modo, solo las cadenas Unicode de Pythonadmite el rango de puntos de código Unicode desde U + 0000 hasta U + FFFF. Cualquier punto de código desde U + 10000 hasta U + 10FFFF se representa mediante 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 la escritura de módulos Python para manipular cadenas de Unicode como series de puntos de código sea bastante inconveniente.

Para solucionar esto, aporté un nuevo módulo. codepoints a 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"