문자열을 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 그것은 또한 일을 작동시키기에 충분할 정도로 트릭을 잘 수행 할 수 있으며 일부 캐릭터를 잃는 것에 대해 신경 쓰지 않습니다.