web-dev-qa-db-ja.com

Python UnicodeDecodeError-エンコードを誤解していますか?

これが機能しない理由についての考えはありますか?私は本当に「無視」が正しいことをすると思った。

>>> 'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 4: ordinal not in range(128)
54
Greg

…「エンコード」と呼ばれる理由があります…

少し前文:ユニコードを標準または理想的な状態と考えてください。 Unicodeは単なる文字の表です。 №65はラテン語の首都Aです。№937はギリシャの首都オメガです。それだけ。

コンピューターがUnicodeを保存および/または操作するには、encodeバイトにエンコードする必要があります。 Unicodeの最も簡単なencodingはUCS-4です。すべての文字は4バイトを占有し、最大1000000文字すべてが使用可能です。 4バイトには、Unicodeテーブル内の文字の番号が4バイト整数として含まれています。もう1つの非常に便利なエンコーディングはUTF-8で、1〜4バイトのUnicode文字をエンコードできます。しかし、「latin1」のようないくつかの制限されたエンコーディングもあります。これには、主に西洋諸国で使用される非常に限られた範囲の文字が含まれます。そのようなencodingsは、文字ごとに1バイトのみを使用します。

基本的に、Unicodeは多くのエンコードでencodedでき、エンコードされた文字列はdecodedUnicodeへ。問題は、Unicodeがかなり遅れたため、8ビットの文字セットを使用して育った私たち全員が、この間ずっと作業をするのが遅すぎることでしたencoded文字列。エンコードは、システムのデフォルトに応じて、ISO8859-1、またはWindows CP437、またはCP850、または、または、またはとなります。

したがって、ソースコードに「add“ Monitoring” to list」という文字列を入力すると(2番目の引用符に注意して、文字列「add“ Monitoring” to list」が必要だと思います)、実際には文字列を既に使用していますencodedシステムのデフォルトコードページに従って(バイト\ x93でWindowsコードページ1252、「Western」を使用すると仮定します)。それからUnicodeを取得したい場合、「cp1252」エンコーディングから文字列をdecodeする必要があります。

だから、あなたがやろうとしていることは:

"add \x93Monitoring\x94 to list".decode("cp1252", "ignore")

不幸なことにPython 2.xには文字列用の.encodeメソッドも含まれています。これは、 "Zip"や "rot13"や " base64 "のもの。Unicodeとは関係ありません。

とにかく、前後のUnicode変換のために覚えておかなければならないことは次のとおりです。

  • unicode文字列はencodedをPython 2.x文字列(実際にはバイトのシーケンス)
  • Python 2.x文字列はUnicode文字列にdecodedを取得します)

どちらの場合も、使用するencodingを指定する必要があります。

私はあまりはっきりしていません、私は眠いです、しかし、私は確かに私が助けることを望みます。

PSユーモラスなサイドノート:マヤ人はユニコードを持っていませんでした。古代ローマ人、古代ギリシャ人、古代エジプト人もそうではありませんでした。それらはすべて独自の「エンコード」を持ち、他の文化をほとんどまたはまったく尊重していませんでした。これらすべての文明は粉塵に砕けました。考えてみてください!人類のために、アプリをUnicode対応にします。 :)

PS2「しかし、中国人…」と言って前のメッセージを台無しにしないでください。しかし、もしそうする気があるなら、ユニコードBMPはほとんど中国語の表意文字で占められていると考えて、それを遅らせてください。エルゴ中国語はユニコードの基礎です。ユニコード対応のアプリケーションを開発する限り、嘘です。

211
tzot

エンコードはユニコード文字列に使用できますが、そこにある文字列はユニコードではないようです(リストにu'add\x93Monitoring\x93で試してください)

>>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
'add \x93Monitoring\x93 to list '
4
rob

このテーマに関する長いブログも書いています。

nicodeの手間とそれに取り組む

0
Gregg Lind