【发布时间】:2009-05-15 10:13:24
【问题描述】:
我想将从文件中读取的多个 unicode 代码点转换为它们的 UTF8 编码。
例如,我想将字符串 'FD9B' 转换为字符串 'EFB69B'。
我可以使用这样的字符串文字手动执行此操作:
u'\uFD9B'.encode('utf-8')
但我无法以编程方式解决。
【问题讨论】:
我想将从文件中读取的多个 unicode 代码点转换为它们的 UTF8 编码。
例如,我想将字符串 'FD9B' 转换为字符串 'EFB69B'。
我可以使用这样的字符串文字手动执行此操作:
u'\uFD9B'.encode('utf-8')
但我无法以编程方式解决。
【问题讨论】:
【讨论】:
chr(int('fd9b', 16)).encode('utf-8')。
''.join('{:02X}'.format(n) for n in chr(int('FD9B', 16)).encode()) 在 Python 3 中给出字符串 'EFB69B'。
chr(int('1f607', 16))
这里有一个完整的解决方案:
>>> ''.join(['{0:x}'.format(ord(x)) for x in unichr(int('FD9B', 16)).encode('utf-8')]).upper()
'EFB69B'
【讨论】:
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'
【讨论】:
data_from_file='\uFD9B'
unicode(data_from_file,"unicode_escape").encode("utf8")
【讨论】:
如果输入字符串长度是 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'
【讨论】:
因为您在使用带有宽 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'
【讨论】: