web-dev-qa-db-ja.com

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)
99
Markum

これはあなたの端末のエンコーディングが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の変種のドキュメントを調べてください。

70
Nick Craig-Wood

試してみてください。

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

だからあなたの問題は他の場所になければならない、おそらくそれを使って何かをやろうとしているなら暗黙の変換が起こっていただろう(印刷、ストリームへの書き込みなど)

もっと言えば、コードを見る必要があるでしょう。

24
mata

私の+ 1へのmataのコメント https://stackoverflow.com/a/10561979/1346705 そしてNick Craig-Woodのデモンストレーションへ。文字列を正しくデコードしました。 printコマンドはUnicode文字列をコンソールのエンコーディングに変換するので問題があります。コンソールは文字列を表示できません。文字列をファイルに書き込み、Unicodeをサポートする適切なエディタを使用して結果を調べます。

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

そうすると(。・ω・。)ノが表示されます。

21
pepr

スクリプトの先頭でシステムのデフォルトエンコーディングをutf-8に設定してみて、すべての文字列がそれを使ってエンコードされるようにします。

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

リモートホストで作業している場合は、ローカル/etc/ssh/ssh_configを見てください)パソコン。

このファイルに行が含まれていると、

SendEnv LANG LC_*

行頭に#を追加してコメントアウトしてください。それは助けるかもしれません。

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

8
Tsutomu

私の端末には問題ありません。上記の答えは私が正しい方向を見るのを助けました、しかし私が'ignore'を加えるまでそれは私のために働きませんでした:

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

以下のコメントに示されているように、これは望ましくない結果につながる可能性があります。 OTOHそれはまた物事を動作させるのに十分うまくトリックを行うかもしれないし、あなたはいくつかの文字を失うことを気にしないでください。

4
guaka

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 __== '__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 __== '__main__':
    # Basic document
    doc = Document('basic')
    fill_document(doc)

ありがとう。

3
hygull

あなたの文字列は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'
1
wim

私の場合、それは私のUnicodeファイルが "BOM"で保存されていることが原因でした。これを解決するために、私はBBEditを使用してファイルを解読し、 "Unicode(UTF-8)"をエンコードするために "Save as ..."を選択しました。 「

1
user336828

これは、Ubuntu 15.10で動作します。

Sudo locale-gen "en_US.UTF-8"
Sudo dpkg-reconfigure locales
1
wlredeye

BOM、それは私にとってBOMです。

ファイルをviする

:set nobomb

そしてそれを保存してください。それは私の場合はほとんど常にそれを修正します

0
Olly W

私は同じタイプのエラーを受けていました、そして、私はコンソールが他の言語で文字列を表示することができないことがわかりました。そのため、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 ])
0
Azam Khan