2011-07-21 148 views
4

我有一個Unicode字符串與功能做了一個十六進制的字符串:的Python:轉換Unicode的十六進制字符串爲Unicode

def toHex(s): 
    res = "" 
    for c in s: 
     res += "%02X" % ord(c) #at least 2 hex digits, can be more 
    return res 

hex_str = toHex(u"...") 

這將返回類似這樣的字符串:

"80547CFB4EBA5DF15B585728" 

這是6箇中國符號的序列。

u"Knödel" 

轉換爲

"4B6EF664656C" 

我現在需要的是轉換這一回原來的unicode功能。中文符號似乎有2個字節的表示形式,而第二個示例則是所有字符都有1個字節的表示形式。所以我不能只爲每個1或2字節塊使用unichr()。

我已經嘗試過

binascii.unhexlify(hex_str) 

但這似乎逐字節轉換並返回一個字符串,不是Unicode。我也試過

binascii.unhexlify(hex_str).decode(...) 

不同的格式。從來沒有得到原始的Unicode字符串。

非常感謝您提前!

回答

3

這似乎就好了工作:

binascii.unhexlify(binascii.hexlify(u"Knödel".encode('utf-8'))).decode('utf-8') 

又回到原來的對象。如果編碼正確,您可以對中文文本執行相同的操作,但ord(x)已經銷燬您開始使用的文本。您需要先對其進行編碼,然後才能像字符串一樣處理。

+0

感謝您的回答!我的問題是,我從第三方軟件獲得Hex-String,因此我對編碼沒有影響... – Robert

+0

問他們什麼是編碼。否則,你將無法正確解碼它... – viraptor

+0

此外,它似乎文本可能是utf-16。 'binascii.unhexlify( 「80547CFB4EBA5DF15B585728」)。解碼('utf-16')似乎返回一些亞洲人(雖然無法驗證) – viraptor

0

無法完成。使用%02X會丟失太多信息。你應該首先使用類似UTF-8的東西,並轉換它,而不是發明一個破碎的編碼。

>>> u"Knödel".encode('utf-8').encode('hex') 
'4b6ec3b664656c' 
+0

感謝您的回答!我的問題是,我從第三方軟件得到Hex-String,因此我對編碼沒有影響...所以你的意思是說,沒有辦法確定重建「80547CFB4EBA5DF15B585728」的含義? – Robert

+0

這是正確的。除非你同意一致的協議,而代碼所提供的蠻力編碼不是。 –

+0

@Robert:如果它是用已知的編碼製作的,則可以獲得文本,例如UTF-8或UTF-16。 – JeremyP

1

前段時間當我在一個VB應用程序中使用Unicode時,如果它們是「0」,那麼前面的1或2位數字將被刪除。意思是「& H00A2」會自動轉換爲「& HA2」,我只是創建了一個小函數來檢查字符串的長度,如果它小於4個字符,添加缺少的0。我不確定這是不是你正在發生的事情,但我想我會提供一些信息作爲要注意的事情。

相關問題