복붙노트

[PYTHON] 인코딩은 "ascii"코덱이 문자를 인코딩 할 수 없음을 나타냅니다. 서수는 범위에 없습니다 (128) "

PYTHON

인코딩은 "ascii"코덱이 문자를 인코딩 할 수 없음을 나타냅니다. 서수는 범위에 없습니다 (128) "

나는 Django RSS 리더 프로젝트를 통해 여기서 일하고있다.

RSS 피드는 "OKLAHOMA CITY (AP) - James Harden let"과 같은 것을 읽을 것입니다. RSS 피드의 인코딩은 encoding = "UTF-8"을 읽으므로 utf-8을 아래 코드 스 니펫의 markdown에 전달합니다. em 대시는 그것이 질식하는 곳입니다.

나는 "ascii"코덱의 Django 오류는 UnicodeEncodeError 인 위치 109 (ordinal not in range (128))에 U '\ u2014'문자를 인코딩 할 수 없습니다. 전달되는 변수에서 "OKLAHOMA CITY (AP) \ u2014 James Harden"을 봅니다. 작동하지 않는 코드 행은 다음과 같습니다.

content = content.encode(parsed_feed.encoding, "xmlcharrefreplace")

나는 markdown 2.0, django 1.1 및 python 2.4를 사용하고 있습니다.

이 작업을 수행하기 위해 수행해야하는 인코딩 및 디코딩의 마법 순서는 무엇입니까?

(Prometheus의 요청에 따라 서식이 도움이된다는 것에 동의 함)

그래서보기에서 나는 parsed_feed 인코딩 라인 위에 smart_unicode 라인을 추가합니다 ...

content = smart_unicode(content, encoding='utf-8', strings_only=False, errors='strict')
content = content = content.encode(parsed_feed.encoding, "xmlcharrefreplace") 

이것은 내 model.py에 문제를 푸시한다.

def save(self, force_insert=False, force_update=False): 
     if self.excerpt: 
         self.excerpt_html = markdown(self.excerpt) 
         # super save after this 

저장 방법을 변경하면 ...

def save(self, force_insert=False, force_update=False): 
     if self.excerpt: 
         encoded_excerpt_html = (self.excerpt).encode('utf-8') 
         self.excerpt_html = markdown(encoded_excerpt_html)

" 'ascii'코덱은 141 바이트 위치의 바이트 0xe2를 디코딩 할 수 없습니다. 서수가 있던 위치에"\ xe2 \ x80 \ x94 "가 있기 때문에 범위가 아닌 서수 (128)가됩니다.

해결법

  1. ==============================

    1.실제로 수신하는 데이터가 UTF-8로 인코딩 된 경우 Python 2.x에서 Python의 'str'객체 인 바이트 시퀀스 여야합니다.

    실제로 수신하는 데이터가 UTF-8로 인코딩 된 경우 Python 2.x에서 Python의 'str'객체 인 바이트 시퀀스 여야합니다.

    다음과 같이 어설 션으로이를 확인할 수 있습니다.

    assert isinstance(content, str)
    

    그 사실을 알게되면 실제 인코딩으로 이동할 수 있습니다. 파이썬은 트랜스 코딩을하지 않습니다. 예를 들어, UTF-8에서 ASCII로 직접 변환합니다. 먼저 바이트 시퀀스를 디코드하여 유니 코드 문자열로 변환해야합니다.

    unicode_content = content.decode('utf-8')
    

    (parsed_feed.encoding을 신뢰할 수있는 경우 리터럴 'utf-8'대신 해당 문자를 사용하십시오. 어느 쪽이든 오류를 대비하십시오.)

    그런 다음 해당 문자열을 가져 와서 ASCII로 인코딩하여 높은 문자를 해당 XML 엔티티로 대체 할 수 있습니다.

    xml_content = unicode_content.encode('ascii', 'xmlcharrefreplace')
    

    전체 방법은 다음과 같습니다.

    try:
        content = content.decode(parsed_feed.encoding).encode('ascii', 'xmlcharrefreplace')
    except UnicodeDecodeError:
        # Couldn't decode the incoming string -- possibly not encoded in utf-8
        # Do something here to report the error
    
  2. ==============================

    2.Django는 Unicode와 bytestrings 사이에서 앞뒤로 변환하기위한 몇 가지 유용한 함수를 제공합니다 :

    Django는 Unicode와 bytestrings 사이에서 앞뒤로 변환하기위한 몇 가지 유용한 함수를 제공합니다 :

  3. ==============================

    3.zip 파일로 파일 이름을 쓰는 동안이 오류가 발생했습니다. 다음은 실패했습니다.

    zip 파일로 파일 이름을 쓰는 동안이 오류가 발생했습니다. 다음은 실패했습니다.

    ZipFile.write(root+'/%s'%file, newRoot + '/%s'%file)
    

    그리고 다음은 작동했습니다.

    ZipFile.write(str(root+'/%s'%file), str(newRoot + '/%s'%file))
    
  4. from https://stackoverflow.com/questions/2513027/encoding-gives-ascii-codec-cant-encode-character-ordinal-not-in-range128 by cc-by-sa and MIT license