2009-03-20 7 views
3

이것은 파이썬 2.4입니다. 여기에 내 상황이있다. 데이터베이스에서 문자열을 가져오고 움라우트 된 'o'(\ xf6)가 포함되어 있습니다. 이 시점에서 유형 (값)을 실행하면 str을 반환합니다. 그런 다음 .decode ('utf-8')를 실행하려고하면 오류가 발생합니다 ('utf8'코덱은 1-4 위치의 바이트를 디코딩 할 수 없습니다).파이썬 2.4에서 유니 코드 문자열을 디코딩 할 수 없습니다.

정말 내 목표는 성공적으로 형식 (값) 반환 유니 코드를 만드는 것입니다. 유용한 정보가있는 earlier question 이 발견되었지만 선택 응답의 예가 나를 대신 실행하지 않는 것 같습니다. 내가 여기서 잘못하고있는 것이 있습니까? 그 첫 번째 명령문에 실패하기 때문에,

Name = 'w\xc3\xb6rner'.decode('utf-8') 
file.write('Name: %s - %s\n' %(Name, type(Name))) 

실제로 쓰기 문에 결코 : 여기

재현하는 몇 가지 코드입니다.

도움 주셔서 감사합니다.

편집 :

내가는 DB의 캐릭터 세트는 UTF8 것을 확인했습니다. 그래서 내 코드를 재현하기 위해 '\ xf6'을 '\ xc3 \ xb6'으로 변경했으며 실패가 여전히 발생합니다. 'utf-8'과 'utf8'의 차이점은 무엇입니까?

코덱을 사용하여 파일에 쓸 팁은 편리합니다 (필자는이 파일을 확실히 사용합니다). 그러나이 시나리오에서는 디버깅 목적으로 만 로그 파일에 쓰려고합니다.

+0

데이터베이스 테이블에서 사용하는 문자셋은 무엇입니까? 아마도 UTF-8이 아닌 것 같습니다. 대신'decode '에 전달하십시오. – elo80ka

답변

2
그래서이 변경 재현하려면 코드에서

는 '\ xf6은' '\ XC3의 \의 XB6', 그리고 실패에 아직 첫 번째 줄에 그렇지 않은

을 발생

>>> 'w\xc3\xb6rner'.decode('utf-8') 
u'w\xf6rner' 

두 번째 줄은 오류가 발생합니다.

>>> file.write('Name: %s - %s\n' %(Name, type(Name))) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 7: ordinal not in range(128) 

비 ASCII 유니 코드 문자를 바이트 스트림에 쓰려고 할 때 기대했던 것입니다. Jiri가 제안한 코덱 랩핑 된 스트림을 사용하는 경우 유니 코드를 직접 작성할 수 있습니다. 그렇지 않으면 유니 코드 문자열을 수동으로 바이트로 다시 인코딩해야합니다.

로깅 목적으로 단순히 변수의 repr()을 내뱉기 만하면됩니다. 그렇다면 유니 코드 문자 나 개행 문자 또는 기타 원하지 않는 문자에 대해 걱정할 필요가 없습니다.

name= 'w\xc3\xb6rner'.decode('utf-8') 
file.write('Name: %r\n' % name) 

Name: u'w\xf6rner' 
3

당신은 "ISO-8859-1"을 사용할 필요가 : UTF-8은 어떤 외부 아스키 탈출을 위해 2 바이트를 사용하지만, 여기에 단지 1 바이트, 그래서 ISO-8859-1은 아마

Name = 'w\xf6rner'.decode('iso-8859-1') 
file.write('Name: %s - %s\n' %(Name, type(Name))) 

옳은.

10

문자열 은 UTF8 인코딩의 경우이 아닙니다. 문자열을 유니 코드로 '디코드'하려면 문자열이 매개 변수로 지정한 인코딩으로되어 있어야합니다.

import codecs 
f = codecs.open("yourfile.txt", "w", "utf8") 
f.write(...) 

의 인코딩을 지정하는 편리 : 나는 이것을 시도하고 완벽하게 작동합니다 :

print 'w\xf6rner'.decode('cp1250') 

편집

당신이 코덱 모듈을 사용할 수있는 파일에 유니 코드 문자열을 쓰기 위해 입/출력 및 다른 인코딩을 신경 쓰지 않고 코드 전체에서 '유니 코드'문자열을 사용합니다.

+0

+1은'import codecs'와'codecs.open()'에 사용됩니다. 좋은 물건! – mknaf

5

분명히 1 바이트 인코딩입니다. UTF-8의 'ö'는 '\ xc3 \ xb6'입니다.

인코딩은 결과 :

  • ISO-8859-1
  • ISO-8859-2
  • ISO-8859-13
  • ISO-8859-15
  • 승-1250
  • win-1252
관련 문제