Python obtener código de caracteres en diferente encoding?

Dado un código de carácter como número entero en una encoding, ¿cómo puede obtener el código de carácter en, digamos, utf-8 y nuevamente como entero?

UTF-8 es una encoding de longitud variable , por lo que asumo que realmente quiso decir “punto de código Unicode”. Use chr() para convertir el código de carácter en un carácter, descodifíquelo y use ord() para obtener el punto de código.

 >>> ord(chr(145).decode('koi8-r')) 9618 

Solo puede asignar un “número entero” de una encoding a otra si ambas son codificaciones de un solo byte .

Aquí hay un ejemplo usando “iso-8859-15” y “cp1252” (también conocido como “ANSI”):

 >>> s = u'€' >>> s.encode('iso-8859-15') '\xa4' >>> s.encode('cp1252') '\x80' >>> ord(s.encode('cp1252')) 128 >>> ord(s.encode('iso-8859-15')) 164 

Tenga en cuenta que ord se está utilizando aquí para obtener el número ordinal del byte codificado . El uso de ord en la cadena original de Unicode daría su punto de código Unicode :

 >>> ord(s) 8364 

La operación inversa a ord se puede hacer usando chr (para códigos en el rango de 0 a 127 ) o unichr (para códigos en el rango de 0 a sys.maxunicode ):

 >>> print chr(65) A >>> print unichr(8364) € 

Para codificaciones de múltiples bytes, generalmente no es posible una asignación simple de “número entero”.

Este es el mismo ejemplo que arriba, pero usando “iso-8859-15” y “utf-8”:

 >>> s = u'€' >>> s.encode('iso-8859-15') '\xa4' >>> s.encode('utf-8') '\xe2\x82\xac' >>> [ord(c) for c in s.encode('iso-8859-15')] [164] >>> [ord(c) for c in s.encode('utf-8')] [226, 130, 172] 

La encoding “utf-8” utiliza tres bytes para codificar el mismo carácter, por lo que no es posible realizar una asignación uno a uno. Dicho esto, muchas codificaciones (incluido “utf-8”) están diseñadas para ser compatibles con ASCII, por lo que generalmente es posible un mapeo para códigos en el rango 0-127 (pero solo de manera trivial, porque el código siempre será el mismo ).

Aquí hay un ejemplo de cómo funciona el baile de encoding / deencoding:

 >>> s = b'd\x06' # perhaps start with bytes encoded in utf-16 >>> map(ord, s) # show those bytes as integers [100, 6] >>> u = s.decode('utf-16') # turn the bytes into unicode >>> print u # show what the character looks like ٤ >>> print ord(u) # show the unicode code point as an integer 1636 >>> t = u.encode('utf-8') # turn the unicode into bytes with a different encoding >>> map(ord, t) # show that encoding as integers [217, 164] 

Espero que esto ayude 🙂

Si necesita construir el Unicode directamente a partir de un entero, use unichr :

 >>> u = unichr(1636) >>> print u ٤