Python : stringio.writelines를 유니 코드 문자열을 수락하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1817695

문제

나는 받고있다

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

아래의 'a.desc'에 저장된 문자열에서 '£'문자가 포함되어 있습니다. 기본 Google App Engine Datastore에 유니 코드 문자열로 저장되어있어 괜찮습니다. cstringio.stringio.writelines 함수는 ascii 형식으로 인코딩하려고 시도하는 것 같습니다.

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

올바른 문구 인 경우 인코딩을 유니 코드로 취급하도록 어떻게 지시합니까?

앱 엔진은 Python 2.5에서 실행됩니다

도움이 되었습니까?

해결책

Stringio 문서:

Stringio 모듈에서 구현 된 메모리 파일과 달리 [cstringio]가 제공 한 파일은 일반 ASCII 문자열로 인코딩 할 수없는 유니 코드 문자열을 허용 할 수 없습니다.

가능하면 cstringio 대신 Stringio를 사용하십시오.

다른 팁

stringio 객체를 a codecs.StreamReaderWriter 오브젝트를 자동으로 인코딩하고 디코딩 할 수 있습니다.

이와 같이:

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)

Stringio에 추가하기 전에 문자열을 수동으로 UTF-8로 인코딩 할 수도 있습니다.

for val in rows:
    if isinstance(val, unicode):
        val = val.encode('utf-8')
result.writelines(rows)

Python 2.6을 소개했습니다 io 모듈과 사용을 고려해야합니다 io.StringIO(), "유니 코드 텍스트의 메모리 스트림."

구형 Python 버전에서는 이것이 최적화되지 않았으며 (Pure Python) 이후 버전에서는 (빠른) C 코드로 최적화되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top