Преобразование кодовой точки Unicode в шестнадцатеричный код UTF8 в Python - PullRequest
13 голосов
/ 15 мая 2009

Я хочу преобразовать число кодовых точек Юникода, считанных из файла, в их кодировку UTF8.

например, я хочу преобразовать строку 'FD9B' в строку 'EFB69B'.

Я могу сделать это вручную, используя строковые литералы, такие как:

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

но я не могу понять, как это сделать программно.

Ответы [ 6 ]

19 голосов
/ 15 мая 2009

Используйте встроенную функцию <a href="http://docs.python.org/library/functions.html#unichr" rel="noreferrer">unichr()</a>, чтобы преобразовать число в символ, а затем кодируйте его:

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

Это сама строка. Если вы хотите, чтобы строка была шестнадцатеричной ASCII, вам нужно пройтись по ней и преобразовать каждый символ c в шестнадцатеричный, используя hex(ord(c)) или аналогичный.

3 голосов
/ 03 марта 2013

вот полное решение:

>>> ''.join(['{0:x}'.format(ord(x)) for x in unichr(int('FD9B', 16)).encode('utf-8')]).upper()
'EFB69B'
3 голосов
/ 15 мая 2009
data_from_file='\uFD9B'
unicode(data_from_file,"unicode_escape").encode("utf8")
2 голосов
/ 15 мая 2009
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'
1 голос
/ 15 мая 2009

Если длина входной строки кратна 4 (т. Е. Ваши кодовые точки Unicode имеют кодировку UCS-2), попробуйте следующее:

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'
0 голосов
/ 09 декабря 2017

Поскольку при использовании unichr с широкими символами Unicode вы можете столкнуться с ошибкой:

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

Вот еще один подход для широкого Unicode на узких сборках Python:

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

И используя значение исходного вопроса:

>>> n = int('FD9B', 16)
>>> s = '\\u{:0>4X}'.format(n)
>>> s = s.decode('unicode-escape')
>>> s.encode("utf-8")
'\xef\xb6\x9b'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...