UnicodeDecodeError: 'ascii' コーデックがバイトをデコードできません
問題
非コードを含む Python 2.x 文字列を変換しようとしたときASCII 文字を Unicode 文字列に変換すると、「UnicodeDecodeError: 'ascii' codec」が発生する場合があります。バイトをデコードできません」というエラーが発生します。これは、デフォルトの動作が ASCII エンコードを想定しており、ASCII 以外の文字を処理できないために発生します。
クイックフィックス
- 文字列を明示的に Unicode 文字列にデコードしていることを確認してください。
- 文字列が UTF-8 でエンコードされていると想定しないでください。
- 変換コードのできるだけ早い段階で、文字列を Unicode 文字列に変換します。
- Unicode の処理を改善するには、ロケールを修正することを検討してください。
- クイック リロード ハックは避けてください。
Unicode についてPython 2.x
Unicode 文字列にはエンコーディングがなく、Unicode ポイント コードを保持します。一方、文字列にはエンコードされたテキスト (UTF-8、UTF-16 など) が含まれます。 Markdown モジュールは品質ゲートとして unicode() を使用するため、受信文字列が Unicode 文字列であることが保証されます。
注意点と例
- エンコードなしの明示的な変換: unicode('€')
- 新しいスタイルの形式文字列を Unicode 文字列に変換: u"通貨は: {}".format('€')
- 古いスタイルの書式文字列を Unicode 文字列に変換します: u'通貨は次のとおりです: %s' % '€'
- 文字列を Unicode に追加します: u'通貨は次のとおりです: '€'
Unicode サンドイッチ
を確立します。コード内の「Unicode サンドイッチ」: 入力データを Unicode にデコードし、Unicode 文字列を操作して、出力時に文字列にエンコードします。これにより、コード途中でのエンコードの問題が回避されます。
入力とデコード
- ソース コード内の Unicode 文字列を接頭辞「u」で定義します (例: u'Zürich')。
- 非 ASCII 文字を含むソース コードの正しいエンコード ヘッダーを設定します (例: # エンコード: utf-8)。
- テキスト ファイル入力に適切なエンコーディングで io.open を使用します。
- 非 ASCII CSV ファイルの処理には backports.csv を利用します。
- データベースを設定します。 Unicode データを返します。
- Content-type ヘッダーに基づいて HTTP コンテンツを手動でデコードします。 charset.
Output
- print() は、Unicode をコンソールのエンコーディングにエンコードしようとします。
- stdout エンコーディングは、PYTHONIOENCODING 環境変数を使用して強制できます。
- io.open を使用して Unicode をバイトにエンコードしますファイル出力用の文字列。
Python 3 の違い
- Python 3 の str は Unicode 文字列です。
- デフォルトのエンコーディングは UTF-8 です。
- open() はデフォルトでテキストモードで動作し、デコードされた str (Unicode) を返します。
以上がPython 2.x で「UnicodeDecodeError: 'ascii' codec can't decode byte」エラーが発生する理由とその修正方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。