2009-05-15 32 views
13

Quiero convertir un número de puntos de código unicode leídos de un archivo a su codificación UTF8.Convertir punto de código unicode en hex UTF8 en python

por ejemplo Quiero convertir la cadena 'FD9B' en la cadena 'EFB69B'.

que pueda hacer esto manualmente usando literales de cadena como esta:

u'\uFD9B'.encode('utf-8') 

pero no puedo encontrar la manera de hacerlo mediante programación.

Respuesta

18

utilizar la función incorporada de unichr() para convertir el número de caracteres, a continuación, codificar que:

>>> unichr(int('fd9b', 16)).encode('utf-8') 
'\xef\xb6\x9b' 

Esta es la propia cadena. Si desea que la cadena sea hexadecimal ASCII, deberá recorrer y convertir cada carácter c en hexadecimal, utilizando hex(ord(c)) o similar.

+4

La salida no es el especificado por la pregunta. De todos modos, si el OP está feliz ... – tzot

+3

FYI para Py3K es 'chr (int ('fd9b', 16)). Encode ('utf-8')'. –

+0

@tzot: ''' .join ('{: 02X}'. Formato (n) para n en chr (int ('FD9B', 16)). Encode())' da la cadena ''EFB69B'' en Python 3. – CoDEmanX

2
Python 2.6.2 (r262:71600, Apr 16 2009, 09:17:39) 
[GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> u'\uFD9B'.encode('utf-8') 
'\xef\xb6\x9b' 
>>> s = 'FD9B' 
>>> i = int(s, 16) 
>>> i 
64923 
>>> unichr(i) 
u'\ufd9b' 
>>> _.encode('utf-8') 
'\xef\xb6\x9b' 
3
data_from_file='\uFD9B' 
unicode(data_from_file,"unicode_escape").encode("utf8") 
1

Si la longitud de cadena de entrada es un múltiplo de 4 (es decir, sus puntos de código Unicode son UCS-2 codificada), a continuación, intentar esto:

import struct 

def unihex2utf8hex(arg): 
    count= len(arg)//4 
    uniarr= struct.unpack('!%dH' % count, arg.decode('hex')) 
    return u''.join(map(unichr, uniarr)).encode('utf-8').encode('hex') 

>>> unihex2utf8hex('fd9b') 
'efb69b' 
3

aquí es una solución completa:

>>> ''.join(['{0:x}'.format(ord(x)) for x in unichr(int('FD9B', 16)).encode('utf-8')]).upper() 
'EFB69B' 
0

Debido a que es posible que se produzca un error durante el uso de unichr con caracteres Unicode de ancho:

>>> n = int('0001f600', 16) 
>>> unichr(n) 
ValueError: unichr() arg not in range(0x10000) (narrow Python build) 

Aquí es otro enfoque para todo el Unicode en Python estrecha construye:

>>> n = int('0001f600', 16) 
>>> s = '\\U{:0>8X}'.format(n) 
>>> s = s.decode('unicode-escape') 
>>> s.encode("utf-8") 
'\xf0\x9f\x98\x80' 

Y utilizando el valor de la pregunta original:

>>> n = int('FD9B', 16) 
>>> s = '\\u{:0>4X}'.format(n) 
>>> s = s.decode('unicode-escape') 
>>> s.encode("utf-8") 
'\xef\xb6\x9b' 
Cuestiones relacionadas