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


106

문자열을 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)

일반적으로 삽입되는 문자열입니다. 인쇄를 시도 할 때도 마찬가지입니다.
Markum

pip 설치시 동일한 문제를 해결하고 여기에서 수정합니다. [install some devel] [1] [1] : stackoverflow.com/questions/17931726/…
BollMose

답변:


70

이것은 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 변형 문서를 참조하십시오.


1
누락 된 로케일도 이유가 될 수 있습니다. 설치하려면 sudo apt-get install language-pack-de또는 sudo locale-gen de_DE.UTF-8(독일어 로케일의 경우)를 실행하십시오 .
Non

나를 위해, 누락 된 환경 변수입니다 LC_ALL, 그리고 그것을 해결 것이라는 단순한 값은C.UTF-8
로빈 윈 슬로

24

시험:

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'합니다.

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

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


둘 다 돌아온다UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-5: character maps to <undefined>
Markum

'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
Markum

1
내가하려는 것은 원래 문자열을 원래 형식으로 인쇄하는 것이지만 (´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë.
Markum

4
stringUTF8 인코딩된다. 인쇄하면 출력 스트림에 바이트를 표시하고 터미널이 utf8로 해석하지 않으면 쓰레기로 끝납니다. 와 decode유니 코드로 변환, 당신은 할 수 encode는 다시 인코딩 터미널 이해에.
mata

21

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()

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


10

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

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

SendEnv LANG LC_*

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

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


감사! 다음은 내가 ansible과 방랑과 PIP 패키지를 설치했다고 문제 해결
Maritza 에스파 르자


5

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)

감사.


1
이것을 사용하는 #coding: utf-8것이 # -*- coding: utf-8 -*-기억하기 쉽습니다. Python PEP 263-Python 소스 코드 인코딩 정의 와 함께 즉시 작동합니다 .
Andrei Krasutski

제안 해 주셔서 감사합니다. 내 끝에서 시도하고 답변으로 업데이트합니다.
hygull

4

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

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

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


2
이것은 잘못된 것입니다. 인코딩 람다 함수가 인코딩 자체를 무시하도록하여 문자를 잃게됩니다.
Maximiliano Rios

2
이것은 원래 인코딩을 모르고 일부 문자를 잃어 버릴 염려가 없었던 문제를 해결했습니다.
Edhowler

2

이것은 우분투 15.10에서 작동합니다.

sudo locale-gen "en_US.UTF-8"
sudo dpkg-reconfigure locales

1

문자열이로 인코딩 된 것 같습니다. utf-8정확히 무엇이 문제입니까? 아니면 여기서 뭘하려는 건데 ..?

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
(。・ω・。)ノ
>>> s2 = u'(。・ω・。)ノ'
>>> s2 == s1
True
>>> s2
u'(\uff61\uff65\u03c9\uff65\uff61)\uff89'

원래 문자열을 그대로 인쇄하면 (´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë제대로 인코딩하고 싶습니다.
Markum

1

제 경우에는 유니 코드 파일이 "BOM"으로 저장되어 발생했습니다. 이 문제를 해결하기 위해 BBEdit를 사용하여 파일을 열고 "유니 코드 (UTF-8)"인코딩을 선택하고 "유니 코드 (UTF-8, BOM 포함)"인코딩을 선택하여 "다른 이름으로 저장 ..."을 수행했습니다. "


0

동일한 유형의 오류가 발생했는데 콘솔이 다른 언어로 문자열을 표시 할 수 없다는 것을 발견했습니다. 따라서 아래 코드를 변경하여 default_charset을 UTF-8로 설정했습니다.

data_head = [('\x81\xa1\x8fo\x89\xef\x82\xa2\x95\xdb\x8f\xd8\x90\xa7\x93x\x81\xcb3\x8c\x8e\x8cp\x91\xb1\x92\x86(\x81\x86\x81\xde\x81\x85)\x81\xa1\x8f\x89\x89\xf1\x88\xc8\x8aO\x81A\x82\xa8\x8b\xe0\x82\xcc\x90S\x94z\x82\xcd\x88\xea\x90\xd8\x95s\x97v\x81\xa1\x83}\x83b\x83v\x82\xcc\x82\xa8\x8e\x8e\x82\xb5\x95\xdb\x8c\xaf\x82\xc5\x8fo\x89\xef\x82\xa2\x8am\x92\xe8\x81\xa1', 'shift_jis')]
default_charset = 'UTF-8' #can also try 'ascii' or other unicode type
print ''.join([ unicode(lin[0], lin[1] or default_charset) for lin in data_head ])


-1

BOM, 너무 자주 BOM

vi 파일, 사용

:set nobomb

저장하십시오. 거의 항상 내 경우에 수정됩니다.


-1

ASCII가 아닌 문자가 포함 된 URL (값이 128보다 큰 바이트)에서 동일한 오류가 발생했습니다.

url = url.decode('utf8').encode('utf-8')

저를 위해 일했습니다. Python 2.7에서이 할당이 str내부 표현 의 '무언가'를 변경 했다고 가정합니다. 즉, 백업 된 바이트 시퀀스의 올바른 디코딩을 강제 url하고 마지막 으로 모든 마법을 사용 하여 문자열을 utf-8에str습니다. 올바른 장소. 파이썬의 유니 코드는 저에게 흑 마법입니다. 유용한 희망


-2

나는 'ENGINE': 'django.db.backends.mysql', 'ENGINE': 'mysql.connector.django'를 사용하지 않는 settings.py 파일에서 변경하는 문제를 해결합니다.


@rayryeng 편집 이유를 설명해 주시겠습니까? 특정 설정을 추천하는 것에서 반대 하는 것으로 OP가 쓴 내용의 의미를 완전히 바꾸는 것 같습니다.
아무도

@AndrewMedico-사과드립니다. 이 게시물이 다른 게시물과 매우 유사하다는 것을 알았으므로 동일하다고 믿었습니다. 나는 되돌아 갈 것이다.
rayryeng 2014-06-30

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.