2015-07-03 29 views
1

我已經從文件加載字符串。當我打印出來的字符串:將UTF-16轉換爲UTF-8

print my_string 
print binascii.hexlify(my_string) 

我得到:

2DF5 
0032004400460035 

含義此字符串是UTF-16。我想這個字符串轉換爲UTF-8,這樣上面的代碼產生這樣的輸出:

2DF5 
32444635 

我已經試過:

my_string.decode('utf-8') 

哪個輸出:

32004400460035 

編輯:

下面是一個快速示例:

hello = 'hello'.encode('utf-16') 
    print hello 
    print binascii.hexlify(hello) 

    hello = hello[2:].decode('utf-8') 
    print hello 
    print binascii.hexlify(hello) 

其中產生這樣的輸出:

��hello 
fffe680065006c006c006f00 
hello 
680065006c006c006f00 

預計產出將是:

��hello 
fffe680065006c006c006f00 
hello 
68656c6c6f 
+0

這不完全是一個艱鉅的任務。你有什麼嘗試,你卡在哪裏? –

+0

另外,您還有沒有BOM的UTF-16數據。根據主要的空值判斷,你有大端的UTF-16,但這可能只是部分數據?數據來自哪裏? –

+0

@MartijnPieters更新了我的嘗試。輸出是從Windows上的程序生成的文件加載的。 – Juicy

回答

2

你的字符串顯示使用utf-16be已編碼:

In [9]: s = "2DF5".encode("utf-16be") 
In [11]: print binascii.hexlify(s) 
0032004400460035 

因此,爲了將其轉換爲utf-8,您首先需要d ECODE,然後對其進行編碼:

In [14]: uni = s.decode("utf-16be") 
In [15]: uni 
Out[15]: u'2DF5' 

In [16]: utf = uni.encode("utf-8") 
In [17]: utf 
Out[17]: '2DF5' 

,或者在一個步:

In [13]: s.decode("utf-16be").encode("utf-8") 
Out[13]: '2DF5' 
+0

但考慮到實際的真實世界的數據中可能存在物料清單。 –

+0

謝謝,我不知道「UTF-16be」,這是問題! – Juicy

+1

@Juicy:請注意,您的實際數據中包含BOM *;當您有BOM時,不需要選擇「be」或「le」,只需解碼爲UTF-16 *,然後BOM就不是解碼值*的一部分。 –