UnicodeDecodeError: 'ascii'コーデックは位置1のバイト0xefをデコードできません


106

文字列をUTF-8にエンコードしようとすると、いくつか問題が発生します。string.encode('utf-8')andの使用など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ときに、同じ満たす:[1] [1] [いくつかのdevelをインストールする] 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(ドイツ語ロケールの場合)を実行します。
以外の

私にとって、欠落している環境変数はでLC_ALL、それを修正する最も単純な値はC.UTF-8
Robin Winslow

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
これstringはutf8でエンコードされています。印刷すると、バイトが出力ストリームに書き込まれ、端末がutf8として解釈しない場合は、ゴミとなってしまいます。decodeあなたはユニコードに変換し、次のことが可能encodeそれが再びエンコードする端末に理解しています。
マタ

21

https://stackoverflow.com/a/10561979/1346705での mataのコメントとNick Craig-Woodのデモンストレーションに対する私の+1 。文字列を正しくデコードしました。printUnicode文字列をコンソールエンコーディングに変換するコマンドに問題があり、コンソールは文字列を表示できません。文字列をファイルに書き込み、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()

次に、表示されます(。・ω・。)ノ


10

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

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

SendEnv LANG LC_*

#行の先頭に追加してコメント化します。役立つかもしれません。

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


ありがとう!これらは、私がansibleおよびvagrantでpipパッケージをインストールしていた問題を解決しました
Maritza Esparza

10

utf-8スクリプトの開始時にシステムのデフォルトのエンコードを設定して、すべての文字列がそれを使用してエンコードされるようにします。

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

この場合、なぜリロードが必要なのですか?
Falldog

ここで説明するように、これはPython 3では機能しません。私にとって、以下のツトムの答えはトリックをしました。
Piyush Goel

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、2018年

提案をありがとう。私の終わりに試して、答えでそれを更新します。
hygull

4

端末に問題はありません。上記の答えは正しい方向を見るのに役立ちましたが、私が追加するまで私にとってはうまくいきませんでした'ignore'

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

以下のコメントに示されているように、これは望ましくない結果につながる可能性があります。OTOHそれはまた、物事を機能させるのに十分なトリックを実行するだけで、一部のキャラクターを失うことを気にしません。


2
これは間違っています。エンコーディングのラムダ関数にエンコーディング自体を無視するように強制しているため、文字が失われています。
Maximiliano Rios

2
これで問題が解決しました。元のエンコーディングがわからず、一部の文字が失われることもありませんでした。
エドハウラー2017年

2

これはubuntu 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」で保存されているUnicodeファイルが原因です。これを解決するために、BBEditを使用してファイルをクラックして開き、「Unicode(UTF-8)」をエンコードするために「名前を付けて保存」を選択しました。 」


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以外の文字(値が128より大きいバイト)を含むURLで同じエラーが発生しました

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

私のために働いた、Python 2.7では、この割り当てがstr内部表現の「何か」を変更したと思います-つまり、バッキングurlされたバイトシーケンスの正しいデコードを強制し、最後にすべての魔法で文字列をutf-8 に入れますstr適切な場所。PythonのUnicodeは私にとって黒魔術です。お役に立てば幸い


-2

「ENGINE」でファイルsettings.pyを変更することでその問題を解決します:「django.db.backends.mysql」、「ENGINE」を使用しないでください:「mysql.connector.django」、


@rayryeng編集の理由を説明してください。特定の設定を推奨することからそれに対して推奨することまで、OPが書いたものの意味を完全に変更ているようです。
誰も

@AndrewMedico-すみません。この投稿は他の投稿と非常に似ているので、同じであると思いました。元に戻します。
rayryeng 2014年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.