UnicodeEncodeError : 'ascii'코덱은 위치 0의 문자 u '\ xef'를 인코딩 할 수 없습니다 : 서 수가 범위에 없습니다 (128).
내 XML 문서를 구문 분석하고 싶습니다. 그래서 XML 문서를 아래와 같이 저장했습니다.
class XMLdocs(db.Expando):
id = db.IntegerProperty()
name=db.StringProperty()
content=db.BlobProperty()
이제 내 아래는 내 코드입니다.
parser = make_parser()
curHandler = BasketBallHandler()
parser.setContentHandler(curHandler)
for q in XMLdocs.all():
parser.parse(StringIO.StringIO(q.content))
아래 오류가 발생합니다.
'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128)
Traceback (most recent call last):
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 517, in __call__
handler.post(*groups)
File "/base/data/home/apps/parsepython/1.348669006354245654/mapreduce/base_handler.py", line 59, in post
self.handle()
File "/base/data/home/apps/parsepython/1.348669006354245654/mapreduce/handlers.py", line 168, in handle
scan_aborted = not self.process_entity(entity, ctx)
File "/base/data/home/apps/parsepython/1.348669006354245654/mapreduce/handlers.py", line 233, in process_entity
handler(entity)
File "/base/data/home/apps/parsepython/1.348669006354245654/parseXML.py", line 71, in process
parser.parse(StringIO.StringIO(q.content))
File "/base/python_runtime/python_dist/lib/python2.5/xml/sax/expatreader.py", line 107, in parse
xmlreader.IncrementalParser.parse(self, source)
File "/base/python_runtime/python_dist/lib/python2.5/xml/sax/xmlreader.py", line 123, in parse
self.feed(buffer)
File "/base/python_runtime/python_dist/lib/python2.5/xml/sax/expatreader.py", line 207, in feed
self._parser.Parse(data, isFinal)
File "/base/data/home/apps/parsepython/1.348669006354245654/parseXML.py", line 136, in characters
print ch
UnicodeEncodeError: 'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128)
UTF-8 BOM (byte order mark)에 도달 한 것 같습니다. BOM이 추출 된이 유니 코드 문자열을 사용해보십시오.
import codecs
content = unicode(q.content.strip(codecs.BOM_UTF8), 'utf-8')
parser.parse(StringIO.StringIO(content))
귀하의 경우에는 연결된 파일 내용으로 인해 BOM이 여러 번 발생했기 때문에 strip
대신 사용 했습니다 lstrip
.
이 문제에 대한 실제 최선의 대답은 사용자 환경, 특히 터미널에서 예상하는 인코딩에 따라 다릅니다.
가장 빠른 한 줄 솔루션은 인쇄 할 수없는 문자는 버리면서 인쇄하는 모든 것을 ASCII로 인코딩하는 것입니다.
print ch #fails
print ch.encode('ascii', 'ignore')
더 나은 해결책은 터미널의 인코딩을 utf-8로 변경하고 인쇄하기 전에 모든 것을 utf-8로 인코딩하는 것입니다. 문자열을 인쇄하거나 읽을 때마다 유니 코드 인코딩에 대해 생각하는 습관을 가져야합니다.
.encode('utf-8')
객체의 끝에 넣는 것만 으로도 최신 버전의 Python에서 작업을 수행 할 수 있습니다.
이것은 나를 위해 일했습니다.
from django.utils.encoding import smart_str
content = smart_str(content)
추적에 따른 문제는의 print
136 행에 있는 진술입니다 parseXML.py
. 불행히도 코드의 해당 부분을 게시하는 데 적합하지 않다고 생각했지만 디버깅을 위해 거기에 있다고 생각합니다. 다음과 같이 변경하는 경우 :
print repr(ch)
그런 다음 적어도 인쇄하려는 내용을 확인해야합니다.
The problem is that you're trying to print an unicode character to a possibly non-unicode terminal. You need to encode it with the 'replace
option before printing it, e.g. print ch.encode(sys.stdout.encoding, 'replace')
.
An easy solution to overcome this problem is to set your default encoding to utf8. Follow is an example
import sys
reload(sys)
sys.setdefaultencoding('utf8')
'Nice programing' 카테고리의 다른 글
파이프 라인의 sh DSL 명령에서 stdout을 캡처 할 수 있습니까? (0) | 2020.10.22 |
---|---|
intl 확장 : php_intl.dll 설치 (0) | 2020.10.22 |
메인 스레드에서 메서드를 호출합니까? (0) | 2020.10.22 |
데이터 테이블에서 페이지 매김을 제거하는 방법 (0) | 2020.10.22 |
NSDictionary에 확인 키가 있습니다. (0) | 2020.10.22 |