2009-05-15 50 views
13

Tôi muốn chuyển đổi một số điểm mã unicode đọc từ một tệp sang mã hóa UTF8 của chúng.Chuyển đổi codicoint unicode thành UTF8 hex trong python

ví dụ: Tôi muốn chuyển đổi chuỗi 'FD9B' thành chuỗi 'EFB69B'.

tôi có thể làm điều này bằng tay sử dụng xâu như thế này:

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

nhưng tôi không thể làm việc ra làm thế nào để làm điều đó programatically.

Trả lời

18

Sử dụng được xây dựng trong chức năng unichr() để chuyển đổi số lượng nhân vật, sau đó mã hóa rằng:

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

Đây là chuỗi riêng của mình. Nếu bạn muốn chuỗi dưới dạng hex ASCII, bạn cần phải đi qua và chuyển đổi từng ký tự c thành hex, sử dụng hex(ord(c)) hoặc tương tự.

+4

Sản lượng không theo quy định của câu hỏi. Dù sao, nếu OP là hạnh phúc ... – tzot

+3

FYI cho Py3K nó 'chr (int ('fd9b', 16)). Mã hóa ('utf-8')'. –

+0

@tzot: ''' .join ('{: 02X}'. Định dạng (n) cho n trong chr (int ('FD9B', 16)). Encode())' cho chuỗi '' EFB69B'' trong 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

Nếu chiều dài chuỗi đầu vào là một bội số của 4 (tức là mã unicode điểm của bạn là UCS-2 mã hóa), sau đó thử này:

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

đây là một giải pháp hoàn chỉnh:

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

Vì bạn có thể gặp lỗi khi sử dụng unichr với ký tự unicode rộng:

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

Đây là cách tiếp cận khác cho unicode rộng trên python hẹp xây dựng:

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

Và sử dụng giá trị câu hỏi ban đầu của:

>>> n = int('FD9B', 16) 
>>> s = '\\u{:0>4X}'.format(n) 
>>> s = s.decode('unicode-escape') 
>>> s.encode("utf-8") 
'\xef\xb6\x9b' 
Các vấn đề liên quan