56

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

>>> '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)
4

4 に答える 4

214

…「エンコーディング」と呼ばれるのには理由があります…</p>

少し前置き: Unicode を標準、または理想的な状態と考えてください。Unicode は単なる文字のテーブルです。№65 はラテン大文字の A です。№937 はギリシャ大文字のオメガです。それだけ。

コンピュータが Unicode を保存および操作するには、Unicodeをバイトにエンコードする必要があります。Unicodeの最も単純なエンコーディングは UCS-4 です。すべての文字が 4 バイトを占め、最大 1000000 文字すべてが利用可能です。4 バイトには、Unicode テーブル内の文字数が 4 バイト整数として含まれています。もう 1 つの非常に便利なエンコーディングは UTF-8 です。これは、任意の Unicode 文字を 1 ~ 4 バイトでエンコードできます。ただし、"latin1" など、文字の範囲が非常に限られている限定的なエンコーディングもいくつかあり、主に西側諸国で使用されています。このようなエンコーディングでは、1 文字につき 1 バイトしか使用されません。

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

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

だから、あなたがするつもりだったのは:

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

残念なことに、Python 2.x には.encode文字列用のメソッドも含まれています。これは、「zip」、「rot13」、「base64」など、Unicode とは関係のない「特別な」エンコーディング用の便利な関数です。

とにかく、前後の Unicode 変換について覚えておく必要があるのは、次のとおりです。

  • Unicode 文字列はPython 2.x 文字列 (実際には、一連のバイト) にエンコードされます。
  • Python 2.x 文字列はUnicode 文字列にデコードされます

どちらの場合も、使用するエンコーディングを指定する必要があります。

よくわかりませんが、眠いのですが、お役に立てれば幸いです。

PS ユーモラスな補足: マヤ人には Unicode がありませんでした。古代ローマ人、古代ギリシャ人、古代エジプト人もそうではありませんでした。彼らはすべて独自の「エンコーディング」を持っており、他の文化をほとんどまたはまったく尊重していませんでした。これらの文明はすべて粉々に崩れ落ちました。考えてみてください!人類のために、アプリを Unicode 対応にしましょう。:)

PS2 「でも中国人は…」と言って前のメッセージを台無しにしないでください。ただし、そうする傾向がある、またはそうする義務があると思われる場合は、Unicode BMP のほとんどが中国語の表意文字で占められていると考えて、それを遅らせてください。したがって、中国語は Unicode の基礎です。人々が Unicode 対応のアプリケーションを開発している限り、私はとんでもない嘘を発明し続けることができます。乾杯!

于 2008-12-16T00:45:11.670 に答える
4

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

>>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
'add \x93Monitoring\x93 to list '
于 2008-12-15T16:02:02.617 に答える
-3

これはうまくいくようです:

'add \x93Monitoring\x93 to list '.decode('latin-1').encode('latin-1')

何か問題はありますか?「無視」、「置換」などのエンコード エラー処理はいつ行われるのだろうか。

于 2008-12-15T16:10:11.413 に答える