2010-06-07 89 views
3

我有一個Python腳本,可以從多個源(數據庫,文件等)中獲取數據。據稱,所有的字符串都是unicode的,但我最終得到的是以下主題的任何變化(由repr()返回):在Python中處理古怪的編碼

u'D\\xc3\\xa9cor' 
u'D\xc3\xa9cor' 
'D\\xc3\\xa9cor' 
'D\xc3\xa9cor' 

有沒有采取上述字符串和任何回報的四個可靠的方法正確的Unicode字符串?

u'D\xe9cor' # --> Décor 

我能想到的,現在唯一的辦法使用eval()replace(),和深,奇恥大辱永遠不會洗去。

+0

有沒有古怪的編碼,只有古怪的程序員。 – 2010-06-07 10:42:42

回答

4

這只是UTF-8 data。使用.decode將其轉換爲unicode

>>> 'D\xc3\xa9cor'.decode('utf-8') 
u'D\xe9cor' 

您可以執行的'D\\xc3\\xa9cor'情況下額外的字符串逃生解碼。

>>> 'D\xc3\xa9cor'.decode('string-escape').decode('utf-8') 
u'D\xe9cor' 
>>> 'D\\xc3\\xa9cor'.decode('string-escape').decode('utf-8') 
u'D\xe9cor' 
>>> u'D\\xc3\\xa9cor'.decode('string-escape').decode('utf-8') 
u'D\xe9cor' 

爲了處理第二個情況下,你需要檢測,如果輸入的是unicode,並將其轉換成首先str

>>> def conv(s): 
... if isinstance(s, unicode): 
...  s = s.encode('iso-8859-1') 
... return s.decode('string-escape').decode('utf-8') 
... 
>>> map(conv, [u'D\\xc3\\xa9cor', u'D\xc3\xa9cor', 'D\\xc3\\xa9cor', 'D\xc3\xa9cor']) 
[u'D\xe9cor', u'D\xe9cor', u'D\xe9cor', u'D\xe9cor'] 
+0

它適用於特定情況。但是: u'D \\ xc3 \\ xa9cor' - > u'D \\ xc3 \\ xa9cor', u'D \ xc3 \ xa9cor' - > UnicodeEncodeError, 'D \\ xc3 \\ xa9cor' - > u'D \\ xc3 \\ xa9cor', – Tyson 2010-06-07 06:06:00

+0

@泰森:它不能適用於所有情況。你怎麼確定D:\\ xc3 \\ xa9 \\ xc3xa9.png''確實是一個UTF-8編碼的字符串,而不是Windows的路徑名? – kennytm 2010-06-07 06:09:24

+0

我可以假定我收到的數據都不是Windows的路徑名。 – Tyson 2010-06-07 06:17:27

2

寫適配器,知道哪些轉換應該應用到他們的來源。

>>> 'D\xc3\xa9cor'.decode('utf-8') 
u'D\xe9cor' 
>>> 'D\\xc3\\xa9cor'.decode('string-escape').decode('utf-8') 
u'D\xe9cor' 
1

這是我來到之前,我看到KennyTM的正確,更簡潔soltion解決方案:

def ensure_unicode(string): 
    try: 
     string = string.decode('string-escape').decode('string-escape') 
    except UnicodeEncodeError: 
     string = string.encode('raw_unicode_escape') 

    return unicode(string, 'utf-8')