在python中将unicode代码点转换为UTF8十六进制

时间:2009-05-15 10:13:25

标签: python unicode

我想将从文件读取的多个unicode代码点转换为UTF8编码。

例如,我想将字符串'FD9B'转换为字符串'EFB69B'

我可以使用这样的字符串文字手动执行此操作:

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

但是我无法以编程方式解决这个问题。

6 个答案:

答案 0 :(得分:19)

使用内置函数unichr()将数字转换为字符,然后编码:

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

这是字符串本身。如果您希望字符串为ASCII十六进制,则需要使用c或类似字符遍历并将每个字符hex(ord(c))转换为十六进制。

答案 1 :(得分:3)

data_from_file='\uFD9B'
unicode(data_from_file,"unicode_escape").encode("utf8")

答案 2 :(得分:3)

这是一个完整的解决方案:

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

答案 3 :(得分: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'

答案 4 :(得分:1)

如果输入字符串长度是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'

答案 5 :(得分:0)

因为在使用带有宽Unicode字符的unichr时可能会遇到错误:

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

这是针对窄python构建的宽unicode的另一种方法:

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