2013-02-13 3 views
1

다른 문자열이있는 목록이 있습니다. 때로는 그들은 cp1251, ASCII 또는 다른 것입니다. 특히 JSON에이 데이터를 덤프하려고 할 때 오류 (UncicodeDecodeError)가 발생하여 유니 코드로 변환해야합니다.인코딩 검사 및 유니 코드로 변환

어떻게하면됩니까? 당신이 인코딩을 모른다면 그것을 감지 힘든 시간이 될 수 있습니다

unicode_string = encoded_string.decode(encoding) 

하지만, 인코딩 및 예상 언어에 따라 달라집니다 : 당신은 인코딩을 알고 있다면

+0

인코딩에 대한 표시가 있습니까? 인코딩을 추측 할 수도 있지만 부정확 할 것입니다. –

+1

입력 문자열의 몇 가지 예를 포함시킬 수 있습니까? 또한 Python 2.x 또는 3.x를 사용하고 있습니까? –

+0

ASCII는 cp1251의 하위 집합이며 (다른 모든 인코딩과 거의 동일합니다) 문제의 일부분이 문제가되지 않습니다. 문자열 중 일부가 cp1251에 있다는 것을 어떻게 알 수 있습니까? 러시아 데이터를 얻는다면 "다른 것"이 될 수 있습니다. 또는 UTF-8이 될 수도 있습니다. 예제를 제공하십시오. 또한 다른 인코딩을 사용하는 문자열 목록을 얻는 방법을 알려주십시오. –

답변

4

당신은 (파이썬 2.X에서) 유니 코드로의 목록을 변환 할 문자열의 인코딩, 그래서 하나의 방법을 감지 chardet를 사용할 수는 다음과 같습니다

import chardet 

def unicodify(seq, min_confidence=0.5): 
    result = [] 
    for text in seq: 
     guess = chardet.detect(text) 
     if guess["confidence"] < min_confidence: 
      # chardet isn't confident enough in its guess, so: 
      raise UnicodeDecodeError 
     decoded = text.decode(guess["encoding"]) 
     result.append(decoded) 
    return result 

...하는 당신 ' 이 같은 D 사용 :

>>> unicodify(["¿qué?", "什么?", "what?"]) 
[u'\xbfqu\xe9?', u'\u4ec0\u4e48\uff1f', u'what?'] 

주의 : chardet 같은 솔루션은 최후의 수단으로 만 사용해야합니다 (예를 들어, 때문에 과거의 실수로 손상의 데이터 집합을 수리 할 때). 생산 코드에 의존하기에는 너무 취약합니다. 대신 @ bames53이이 대답에 대한 주석에서 지적했듯이, 먼저 데이터를 손상시킨 코드를 수정해야합니다.

+0

Thx! 내가 본이 문제에 대한 더 나은 결정입니다! –

+1

인코딩에서의 추측은 좋은 해결책이 아니므로 가능한 경우에는 피해야합니다. – bames53

+0

@ bames53 OP의 질문에 대한 나의 독서는 추측 *이 필요합니다. –

0

, 꽤 쉽게해야합니다.

-1

유니 코드 기능을 사용하여 문자열을 내장 된 유니 코드 유형으로 변환 해보십시오.

>>> s = "Some string" 
    >>> s = unicode(s) 
    >>> type(s) 
    <type 'unicode'> 

문제를 들어 유니 코드 문자열의 새 목록을 만들려면이 시도.

new = [] 
    for item in myList: 
     new.append(unicode(item)) 

공식 Python Unicode HOWTO을 읽으십시오.

관련 문제