2012-05-23 24 views
8

estoy tratando de escribir en un archivo plano algunos chinos, o no-Inglés caracteres conjuntos rusos o diferentes para propósitos de prueba. Me estoy quedando atrapado en cómo dar salida a un decimal hexadecimal de Unicode o un valor decimal a su personaje correspondiente.Python punto de código Unicode de caracteres Unicode

Por ejemplo, en Python, si tiene un conjunto de caracteres codificados como абвгдежзийкл, debe asignar value = u"абвгдежзийкл" y no hay problema.

Sin embargo, si tenía un solo decimal o decimal hexadecimal como 1081/0439 almacenado en una variable y deseaba imprimirlo con su correspondiente carácter real (y no solo salida 0x439) ¿cómo se haría? El valor decimal/hex Unicode anterior se refiere a й.

+0

Es posible que desee revisar el título de su pregunta Menciona UTF-8, pero la pregunta no tiene nada que ver con UTF-8. – NPE

+2

Su mención constante de "decimal o hex" hace pensar que ignora el hecho de que "decimal o hex" es solo una cuestión de representación y no una propiedad del valor en sí. – glglgl

Respuesta

17

Uso unichr() (Python 2) o chr() (Python 3):

In [4]: print(unichr(1081)) 
Out[4]: й 
+0

Gracias por la respuesta, aunque no es lo que estoy buscando ya que sé cómo manejar las entradas codificadas. Quiero saber cómo manejar valores unicode decimales o hexadecimales en una variable para salida estándar, o salida a archivo. – stoneferry

+0

@stoneferry: simplemente cambie el '1081' al nombre de su variable que contiene el código de carácter. – NPE

+0

Si tengo una variable que contenga el número entero '1081' solamente, ¿cómo podría, por ejemplo, usar el comando print para generar el carácter y no jsut '1081'? – stoneferry

1

Así que la respuesta a la pregunta es:

  1. convertir el valor hexadecimal a decimal con int(hex_value, 16)
  2. entonces obtener la línea correspondiente con chr().

Para resumir:

>>> print(chr(int('0x897F', 16))) 
西 
0

Si se encuentra con el error:

ValueError: unichr() arg not in range(0x10000) (narrow Python build)

Al tratar de convertir el valor hexadecimal usando unichr, se puede conseguir alrededor de ese error al hacer algo como:

>>> n = int('0001f600', 16) 
>>> s = '\\U{:0>8X}'.format(n) 
>>> s 
'\\U0001F600' 
>>> binary = s.decode('unicode-escape') 
>>> print(binary) 

Cuestiones relacionadas