[python] UnicodeDecodeError : ‘ascii’코덱이 위치 1의 바이트 0xef를 디코딩 할 수 없습니다.

문자열을 UTF-8로 인코딩하는 데 몇 가지 문제가 있습니다. string.encode('utf-8')및 사용을 포함하여 여러 가지를 시도했지만 unicode(string)오류가 발생합니다.

UnicodeDecodeError : ‘ascii’코덱은 위치 1에서 0xef 바이트를 디코딩 할 수 없습니다. 서 수가 범위에 없습니다 (128).

이것은 내 문자열입니다.

(。・ω・。)ノ

무슨 일이 일어나고 있는지 모르겠어요.

편집 : 문제는 문자열을 그대로 인쇄하는 것이 제대로 표시되지 않는다는 것입니다. 또한 변환하려고 할 때이 오류 :

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)



답변

이것은 UTF-8로 설정되지 않은 터미널의 인코딩과 관련이 있습니다. 여기 내 터미널입니다

$ echo $LANG
en_GB.UTF-8
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
(。・ω・。)ノ
>>> 

내 터미널에서 예제는 위와 함께 작동하지만 LANG설정을 제거 하면 작동하지 않습니다.

$ unset LANG
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
>>> 

이 변경 사항을 영구적으로 만드는 방법을 알아 보려면 Linux 변형 문서를 참조하십시오.


답변

시험:

string.decode('utf-8')  # or:
unicode(string, 'utf-8')

편집하다:

'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8')제공 u'(\uff61\uff65\u03c9\uff65\uff61)\uff89'합니다.

그래서 당신의 문제는 다른 장소에 있어야합니다. 암묵적 변환이 진행되고 있다면 (인쇄, 스트림에 쓰기 …) 뭔가를 시도하면 가능합니다.

더 말하면 코드를 볼 필요가 있습니다.


답변

https://stackoverflow.com/a/10561979/1346705 에서 mata의 의견 과 Nick Craig-Wood의 데모에 대한 +1 . 문자열을 올바르게 디코딩했습니다. 문제는 print유니 코드 문자열을 콘솔 인코딩으로 변환하고 콘솔이 문자열을 표시 할 수 없기 때문에 명령에 있습니다. 문자열을 파일에 쓰고 유니 코드를 지원하는 괜찮은 편집기를 사용하여 결과를보십시오.

import codecs

s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
s1 = s.decode('utf-8')
f = codecs.open('out.txt', 'w', encoding='utf-8')
f.write(s1)
f.close()

그러면 (。・ω・。)ノ.


답변

원격 호스트에서 작업하는 경우 로컬 PC /etc/ssh/ssh_config에서 확인하십시오 .

이 파일에 한 줄이 포함 된 경우 :

SendEnv LANG LC_*

#줄 머리글에 추가하여 주석 처리하십시오 . 도움이 될 수 있습니다.

이 라인 ssh을 통해 PC의 언어 관련 환경 변수를 원격 호스트로 보냅니다 . 그것은 원인 의 많은 문제.


답변

utf-8스크립트 시작 부분에서 시스템 기본 인코딩을 설정하여 모든 문자열이이를 사용하여 인코딩되도록하십시오.

# coding: utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')


답변

Andrei Krasutski가 제안한 대로 스크립트 상단에 아래 코드를 사용하는 것이 좋습니다.

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

그러나 # -*- coding: utf-8 -*스크립트 맨 위에 줄을 추가하는 것이 좋습니다 .

그것을 생략하면 실행하려고 할 때 내 경우 오류가 발생 basic.py합니다.

$ python basic.py
  File "01_basic.py", line 14
SyntaxError: Non-ASCII character '\xd9' in file basic.py on line 14, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

다음은 basic.py위의 오류가 발생 하는 코드 입니다.

오류가있는 코드

from pylatex import Document, Section, Subsection, Command, Package
from pylatex.utils import italic, NoEscape

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def fill_document(doc):
    with doc.create(Section('ِش سثؤفهخى')):
        doc.append('إخع ساخعمي شمصشغس سحثشن فاث فقعفا')
        doc.append(italic('فشمهؤ ؤخىفثىفس شقث شمسخ ىهؤث'))

        with doc.create(Subsection('آثص ٍعلاسثؤفهخى')):
            doc.append('بشةخعس ؤقشئغ ؤاشقشؤفثقس: $&#{}')


if __name__ == '__main__':
    # Basic document
    doc = Document('basic')
    fill_document(doc)

그런 다음 # -*- coding: utf-8 -*-맨 위에 줄을 추가 하고 실행했습니다. 효과가있었습니다.

오류없는 코드

# -*- coding: utf-8 -*-
from pylatex import Document, Section, Subsection, Command, Package
from pylatex.utils import italic, NoEscape

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def fill_document(doc):
    with doc.create(Section('ِش سثؤفهخى')):
        doc.append('إخع ساخعمي شمصشغس سحثشن فاث فقعفا')
        doc.append(italic('فشمهؤ ؤخىفثىفس شقث شمسخ ىهؤث'))

        with doc.create(Subsection('آثص ٍعلاسثؤفهخى')):
            doc.append('بشةخعس ؤقشئغ ؤاشقشؤفثقس: $&#{}')


if __name__ == '__main__':
    # Basic document
    doc = Document('basic')
    fill_document(doc)

감사.


답변

내 터미널에 문제가 없습니다. 위의 답변은 올바른 방향을 찾는 데 도움이되었지만 다음을 추가 할 때까지 작동하지 않았습니다 'ignore'.

fix_encoding = lambda s: s.decode('utf8', 'ignore')

아래 설명에서 알 수 있듯이 이로 인해 원하지 않는 결과가 발생할 수 있습니다. OTOH 그것은 또한 일을 작동시키기에 충분할 정도로 트릭을 잘 수행 할 수 있으며 일부 캐릭터를 잃는 것에 대해 신경 쓰지 않습니다.