ホームページ > バックエンド開発 > Python チュートリアル > Python の「UnicodeDecodeError: 'ascii' codec can't decode byte」エラーを解決する方法?

Python の「UnicodeDecodeError: 'ascii' codec can't decode byte」エラーを解決する方法?

Mary-Kate Olsen
リリース: 2024-12-10 17:00:12
オリジナル
221 人が閲覧しました

How to Solve Python's

「UnicodeDecodeError: 'ascii' コーデックがバイトをデコードできません」を修正する方法

tl;dr / クイック フィックス

  • 回避不必要なデコード/エンコード。
  • 想定しないでください文字列の UTF-8 エンコーディング。
  • コード内でできるだけ早く文字列を Unicode 文字列に変換します。
  • ロケールを調整します (参照: Python 3.6 で UnicodeDecodeError を解決する方法?)。
  • すぐにリロードしたいという誘惑に抵抗してくださいhacks.

Python 2.x の Unicode Zen

UnicodeDecodeError: 'ascii' codec can't decode byte は、通常、非を含む Python 2.x str を変換しようとすると発生します。 -元の文字列のエンコーディングを指定せずに、ASCII 文字を Unicode 文字列に変換します。

Unicode 文字列(Unicode とも呼ばれます) は、Unicode ポイント コードを保持する Python の別個の文字列タイプであり、スペクトル全体の任意の Unicode ポイントを表すことができます。対照的に、文字列にはさまざまな形式 (UTF-8、UTF-16、ISO-8895-1 など) でエンコードされたテキストが含まれます。

Markdown モジュールの開発者は、おそらく unicode() を品質ゲートとして使用して、受信を保証します。文字列はUnicodeです。受信文字列のエンコーディングを決定できないため、Markdown に渡す前にデコードする必要があります。

Unicode 文字列は、「u」プレフィックスを使用してコード内で宣言できます:

my_u = u'my ünicôdé strįng'
print(type(my_u)) # <type 'unicode'>
ログイン後にコピー
ログイン後にコピー

Unicode 文字列は、ファイル、データベース、またはネットワーク モジュールからも発生する可能性があり、その場合は、

注意点

Unicode 変換は、明示的な unicode() 呼び出しがなくても発生する可能性があります。

# Explicit conversion without encoding
unicode('€')

# New-style format string into Unicode string
# Python attempts to convert value string to Unicode first
u"The currency is: {}".format('€')

# Old-style format string into Unicode string
# Python attempts to convert value string to Unicode first
u'The currency is: %s' % '€'

# Append string to Unicode
# Python attempts to convert string to Unicode first
u'The currency is: ' + '€'
ログイン後にコピー

次の図では、「カフェ」 」は端末の種類により「UTF-8」と「Cp1252」でエンコードが異なります。どちらの場合も、「caf」はプレーン ASCII でエンコードされます。 UTF-8 では「é」を表すのに 2 バイトを使用しますが、Cp1252 では Unicode ポイント値とも一致する 1 バイトを使用します。この場合、正しいエンコーディングで decode() が呼び出され、Unicode への変換が正常に実行されます。

[正しいエンコーディングでの Unicode 変換の成功の図]

ただし、decode の場合() は「ascii」で呼び出されます。これは、エンコーディングを指定せずに unicode() を呼び出すのと似ており、UnicodeDecodeError が発生します。

[間違ったエンコーディングで失敗した Unicode 変換の図]

Unicode サンドイッチ

コード内に「Unicode サンドイッチ」を作成することをお勧めします。ここで、

  1. すべての受信データを Unicode にデコードします。
  2. Unicode 文字列に対して操作を実行します。
  3. 途中で str にエンコードします。

このアプローチにより、全体を通して文字列のエンコードについて心配する必要がなくなります。 code.

入力/デコード

  • ソースの場合コードの場合は、Unicode 文字列リテラル (例: u'Zürich') を使用し、エンコード ヘッダー (例: #coding: utf-8) を追加します。
  • ファイルの場合は、io モジュールの TextWrapper を適切なエンコーディング:

    my_u = u'my ünicôdé strįng'
    print(type(my_u)) # <type 'unicode'>
    ログイン後にコピー
    ログイン後にコピー
  • データベースの場合は、Unicode データを返し、SQL クエリに Unicode 文字列を使用するように接続を設定します。
  • HTTP の場合は、response.text で Unicode を返す Python リクエスト ライブラリの使用を検討してください。 .
  • 手動デコードの場合は、my_string.decode(encoding) を使用します。エンコードは適切です。 value.

出力

  • stdout/printing: Python は、Unicode 文字列をコンソールのエンコーディングにエンコードするようにエンコーダー forstdout を構成しようとします。コンソールのエンコードが正しくない場合、エラーが発生する可能性があります。
  • ファイル: io.open は Unicode を透過的にバイト文字列にエンコードできます。
  • データベース: 適切な設定により、Unicode データを直接データベース。

以上がPython の「UnicodeDecodeError: 'ascii' codec can't decode byte」エラーを解決する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート