Nice programing

UnicodeEncodeError : 'ascii'코덱은 위치 0의 문자 u '\ xef'를 인코딩 할 수 없습니다 : 서 수가 범위에 없습니다 (128).

nicepro 2020. 10. 22. 22:48
반응형

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)

추적에 따른 문제는의 print136 행에 있는 진술입니다 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')

참고URL : https://stackoverflow.com/questions/5141559/unicodeencodeerror-ascii-codec-cant-encode-character-u-xef-in-position-0

반응형