111

文字列を 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)
4

16 に答える 16

72

これは、端末のエンコーディングが 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 バリアントのドキュメントを参照してください。

于 2012-05-12T11:05:58.027 に答える
25

試す:

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'、これは正しいです。

したがって、問題は別の場所にある必要があります。おそらく、それを使って何かをしようとすると、暗黙の変換が行われている場合があります(印刷、ストリームへの書き込みなど)。

もっと言うには、いくつかのコードを見る必要があります。

于 2012-05-12T07:53:01.310 に答える
22
于 2012-05-12T11:43:09.373 に答える
10

リモートホストで作業している場合は、ローカルPCで確認し/etc/ssh/ssh_configてください。

このファイルに次の行が含まれている場合:

SendEnv LANG LC_*

行頭に追記してコメントアウト#。それは役立つかもしれません。

この行でssh、PC の言語関連の環境変数をリモートホストに送信します。それは多くの問題を引き起こします。

于 2014-09-28T01:18:54.750 に答える
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)

ありがとう。

于 2018-03-21T08:14:39.270 に答える
2

これはubuntu 15.10で機能します:

sudo locale-gen "en_US.UTF-8"
sudo dpkg-reconfigure locales
于 2016-07-11T13:07:00.753 に答える
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'
于 2012-05-12T08:08:53.883 に答える
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 ])
于 2016-05-10T10:16:57.497 に答える
-2

ファイル settings.py を 'ENGINE': 'django.db.backends.mysql' に変更して問題を解決します。'ENGINE': 'mysql.connector.django' は使用しないでください。

于 2014-06-29T04:27:53.613 に答える