2009-11-30 4 views
23

나는 그것이 '£'문자가 포함되어 아래와 같이 'a.desc'에 저장된 문자열에Python : 유니 코드 문자열을 허용하도록 StringIO.writelines를 얻는 방법은 무엇입니까?

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

을 얻고있다. 유니 코드 문자열로 기본 Google App Engine 데이터 저장소에 저장되므로 괜찮습니다. cStringIO.StringIO.writelines 기능은 겉으로는 아스키 형식으로 인코딩하려고 노력하고있다 :

result.writelines(['blahblah',a.desc,'blahblahblah']) 

어떻게 그 올바른 말씨가의 경우는 유니 코드로 인코딩을 처리하도록 지시 하는가?

애플리케이션 엔진 파이썬 2.5

답변

21

StringIO documentation 실행 다음있는 StringIO 모듈에 의해 구현되는 메모리 파일과는 달리

[cStringIO 의해 제공되는 것과 같이 인코딩 될 수없는 유니 코드 문자열을 수락 할 수없는 일반 ASCII 문자열.

가능하면 cStringIO 대신 StringIO를 사용하십시오.

+1

나는 (cStringIO는 성능면에서 더 좋음을 의미한다) 오류가 발생하지 않았지만 '£'대신 'Â £'을 인쇄했다. 왜 지금 'Â'이 (가) 표시됩니까? – rutherford

+4

'£'는 UTF-8 인코딩 인 0xc2 0xa3의 Windows-1252 디코딩입니다. 어쩌면 터미널, 앱 또는보고있는 곳이면 UTF-8 대신 Windows-1252 용으로 구성되었을 것입니다. – Phil

+0

흠. 기본적으로 저는 Chrome 브라우저를 통해 웹 서버 응답을보고 있습니다. 그것이 문제일까요? – rutherford

36

codecs.StreamReaderWriter 개체에 StringIO 개체를 래핑하면 유니 코드를 자동으로 인코딩하고 디코딩 할 수 있습니다. 이와 같이

:

import cStringIO, codecs 
buffer = cStringIO.StringIO() 
codecinfo = codecs.lookup("utf8") 
wrapper = codecs.StreamReaderWriter(buffer, 
     codecinfo.streamreader, codecinfo.streamwriter) 

wrapper.writelines([u"list of", u"unicode strings"]) 

buffer은 UTF-8 인코딩 바이트로 채워질 것이다.

내가 제대로 사건을 이해하는 경우에만 작성해야합니다, 그래서 당신은 할 수 :

import cStringIO, codecs 
buffer = cStringIO.StringIO() 
wrapper = codecs.getwriter("utf8")(buffer) 
+1

또한,'cStringIO.StringIO()'에 의해 반환 된 파일과 유사한 객체는'with' 문에서 작동하지 않지만'codecs.StreamReaderWriter()'에 의해 반환 된 래퍼는 작동합니다! – steveha

+0

https://stackoverflow.com/q/45101658/562769와 비슷하게 들립니다. 제 질문에 대한 답변을 알고 계십니까? –

3

당신은 수동으로 StringIO

에 추가하기 전에 UTF-8와 같은 문자열을 인코딩 할 수 있습니다
for val in rows: 
    if isinstance(val, unicode): 
     val = val.encode('utf-8') 
result.writelines(rows) 
+2

'type is X' 대신'isinstance'를 사용하십시오. – chown

0

파이썬 2.6은 io 모듈을 도입했으며 io.StringIO(), "유니 코드 텍스트 용 메모리 내 스트림"을 고려해야합니다.

이전 버전의 Python에서는 최적화되지 않았으며 (순수 Python), 이후 버전에서는 (빠른) C 코드로 최적화되었습니다.

관련 문제