2010-06-07 5 views
3

나는 많은 소스 (데이터베이스, 파일 등)의 데이터를 가져 오는 파이썬 스크립트를 가지고있다. 아마, 모든 문자열은 유니 코드,하지만 난 (repr()에 의해 반환) 다음과 같은 주제에 어떤 변형지고 결국 무엇을 :파이썬에서 엉뚱한 인코딩 다루기

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

위의 문자열과 반환의 네을 할 수있는 신뢰할 수있는 방법이 있나요이 적절한 유니 코드 문자열? 내가 지금 생각할 수있는

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

있는 유일한 방법은, replace()eval() 사용하고, 깊은, 불타는 수치 씻어하지 않을 것이다.

+0

더 이상한 인코딩 만 엉뚱한 프로그래머가 없습니다. –

답변

4

그냥 UTF-8 data입니다. unicode으로 변환하려면 .decode을 사용하십시오.

>>> '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' 

뿐만 아니라 2 경우를 처리하려면 입력이 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

+0

@Tyson : 모든 경우에 작동 할 수는 없습니다. ''D : \\ xc3 \\ xa9 \\ xc3xa9.png '가 실제로는 Windows 경로 이름이 아니라 UTF-8로 인코딩 된 문자열인지 어떻게 확인할 수 있습니까? – kennytm

+0

내가받는 데이터 중 Windows 경로 이름이 없다고 가정 할 수 있습니다. – Tyson

2

소스에 적용해야하는 변환을 아는 어댑터를 작성하십시오.

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

여기에 내가 KennyTM의 적절한,보다 간결 한가 지를보기 전에에 온 솔루션입니다 :

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')