2011-08-04 10 views
14

일부 문자열을 파일에 쓰려고합니다 (HTML 파서 BeautifulSoup에 의해 문자열이 나에게 전달되었습니다).파일에 쓸 때 UnicodeEncodeError

내가 그들을 표시하기 위해 "인쇄"를 사용할 수 있지만, 나는 file.write가을() 나는 다음과 같은 오류 얻을 사용할 때 :

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 6: ordinal not in range(128) 

가 어떻게이를 구문 분석 할 수 있습니까?

답변

11

이 오류는 영문자가 아닌 문자 (유니 코드 문자가 128 이상)가 포함 된 유니 코드 문자열을 ASCII 바이트 문자열이 필요한 문자열로 전달할 때 발생합니다. 파이썬 bytestring의 기본 인코딩은 "정확히 128 자 (영문)"를 처리하는 ASCII입니다. 이 때문에 유니 코드 문자를 128 이상으로 변환하려고하면 오류가 발생합니다.

유니()

unicode(string[, encoding, errors]) 

생성자 서명 유니 (문자열 [, 부호화, 오류])이있다. 모든 인수는 8 비트 문자열이어야합니다.

첫 번째 인수는 지정된 인코딩을 사용하여 유니 코드로 변환됩니다. 당신은 인코딩 인수를 생략 할 경우 127보다 큰 문자는 예를 들어 오류

으로 처리됩니다 있도록 ASCII 인코딩, 변환에 사용되는

s = u'La Pe\xf1a' 
print s.encode('latin-1') 

또는

write(s.encode('latin-1')) 

은 latin-1을 사용하여 인코딩합니다.

+0

가 출력 년대 문자열이 유효한 ASCII하지 않은 "£ 123" – Rory

+0

같은 가격입니다. 파운드 기호는 127 ASCII 범위를 벗어난 char 코드 163입니다. –

+0

이러한 문자를 인코딩 할 수있는 인코딩을 지정해야합니다. 파일에는 문자가 포함되어 있지 않습니다. 그들은 바이트를 포함합니다. 인코딩은 문자를 바이트로 변환합니다. –

17

예, 약 99.9 % 베테랑 파이썬 사용자들은 이전에 그것을 보았습니다.

Google에 'python unicode'를 입력하면 약 1,400 만 개의 결과가 표시됩니다. 첫 번째는 http://docs.python.org/howto/unicode.html 끔찍한 세부 사항을 전체 상황을 설명하는 공식 문서입니다; 네 번째는 http://farmdev.com/talks/unicode/입니다. 실용적인 개요는 거의 숟가락으로 답을주고, 무슨 일이 일어나는지를 이해할 수있게 해줍니다.

이러한 종류의 개요를 읽고 이해해야 할 필요가 있습니다. 주변을 둘러 보는 일은 정말로 없습니다. 텍스트가 어렵습니다. "평범한 텍스트"와 같은 것은 존재하지 않습니다. 몇 년 동안 합리적인 팩시밀리가 없었고, 실제로 존재하지도 않았습니다. 그러나 유니 코드는 적어도 표준입니다.

또한 http://www.joelonsoftware.com/articles/Unicode.html을 읽어야합니다.

+0

링크를 제공해 주셔서 감사합니다! 매우 도움이 – tatlar

4

질문에 대한 대답은 "코덱 사용"입니다. appeded 코드는 일부 gettext 마법, FWIW를 보여줍니다. 구글은이 문제에 안타의 전체 임에도 불구하고

import codecs 

import gettext 

localedir = './locale' 
langid = wx.LANGUAGE_DEFAULT # use OS default; or use LANGUAGE_JAPANESE, etc. 
domain = "MyApp"    
mylocale = wx.Locale(langid) 
mylocale.AddCatalogLookupPathPrefix(localedir) 
mylocale.AddCatalog(domain) 

translater = gettext.translation(domain, localedir, 
           [mylocale.GetCanonicalName()], fallback = True) 
translater.install(unicode = True) 

# translater.install() installs the gettext _() translater function into our namespace... 

msg = _("A message that gettext will translate, probably putting Unicode in here") 

# use codecs.open() to convert Unicode strings to UTF8 

Logfile = codecs.open(logfile_name, 'w', encoding='utf-8') 

Logfile.write(msg + '\n') 

http://wiki.wxpython.org/Internationalization, 나는 오히려 열심히 (이 유니 코드에 대한 파이썬 문서에 실제로, 오히려 묻혀)이 간단한 해결책을 찾기 위해 발견했다.

그래서 ... HTH ...

GAJ

+0

"단순"? 그것은 OP가 신경 쓰지 않는 많은 기계들을 보여주고 있습니다. 그는 사람들이 올바른 언어로 텍스트를 볼 수 있도록 노력하지 않고 특정 소스의 특정 언어로 텍스트를 가져 와서 파일에 넣으려고합니다. . 그래서 snipped의 유일한 관련 부분은 첫 번째 줄과 마지막 두 줄입니다. "찾기 힘들다"는 말은 정말로? 당신은 Google을 위해 무엇을 했습니까? 'UnicodeEncodeError : 'ascii'코덱이 문자를 인코딩 할 수 없습니다. '; 결과는 충분히 도움이 될 것 같습니다 ... –

관련 문제