2011-12-22 19 views

Respuesta

9

UTF-8 is a variable-length encoding, así que supongo que realmente quiso decir "punto de código Unicode". Use chr() para convertir el código de carácter en un carácter, decodifíquelo y use ord() para obtener el punto de código.

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

'chr() arg no en el rango (256)' para 'shift_jisx0213' –

+3

En Python 2, 'chr' solo admite ASCII, por lo que solo los números en el rango' [0..255] '. Use 'unichr' en su lugar para soporte Unicode. – poke

+0

Hmm 'UnicodeEncodeError: el códec 'ascii' no puede codificar el carácter u '\ u8140' en la posición 0 : ordinal no en el rango (128)' –

2

He aquí un ejemplo de cómo funciona el baile de codificación/decodificación:

>>> 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] 

Esperanza esto ayuda :-)

Si necesita construir el Unicode directamente de un entero, utilice unichr:

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

Haces c un único mapa un "número entero" de una codificación a otra si 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 aquí se utiliza para obtener el número ordinal del byte codificado . Usando ord en la cadena Unicode originales daría su punto de código Unicode:

>>> ord(s) 
8364 

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

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

para codificaciones múltiples bytes, un simple "número entero" mapeo no suele ser posible.

Así es el mismo ejemplo que el anterior, pero utilizando "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 codificación "UTF-8" utiliza tres bytes para codificar el mismo carácter, por lo que no es posible un mapeo de uno a uno. Habiendo dicho eso, muchas codificaciones (incluyendo "utf-8") están diseñadas para ser compatibles con ASCII, por lo que una asignación es generalmente posible para códigos en el rango 0-127 (pero solo trivialmente, porque el código siempre será lo mismo).

+0

Esto es, lo que llamo, una respuesta perfecta :) –

Cuestiones relacionadas