Python UnicodeDecodeError: ASCII コーデックは位置のバイトをデコードできません: 序数が範囲外です

Abid Ullah 2023年6月21日
  1. Python での Unicode デコード エラー
  2. Python で Unicode デコード エラーを解決する方法
Python UnicodeDecodeError: ASCII コーデックは位置のバイトをデコードできません: 序数が範囲外です

この記事では、コードの実行中に発生する UnicodeDecodeError を解決する方法を学びます。 このエラーの原因となるさまざまな理由を見ていきます。

また、Python でこのエラーを解決する方法も見つけます。 Python での UnicodeDecodeError とは何かから始めましょう。

Python での Unicode デコード エラー

UnicodeDecodeError が繰り返し発生し、その理由や解決方法がわからない場合は、この記事をお読みください。

この記事では、このエラーが発生する理由と、それを解決する簡単な方法について詳しく説明します。

Python での Unicode デコード エラーの原因

Python では、ある種類のコーデックを使用して、このコーデックを使用してエンコードされていないバイトをデコードしようとすると、UnicodeDecodeError が発生します。 より具体的に言うと、錠前と鍵の例えを使ってこの問題を理解しましょう。

そのロック専用に作成された一意のキーを使用してのみ開くことができるロックを作成したとします。

このロック用に作られていないキーでこのロックを開こうとするとどうなりますか? それは合わないでしょう。

次の内容でファイル example.txt を作成しましょう。

𝘈Ḇ𝖢𝕯٤ḞԍНǏ
hello world

次のコードを使用して、ascii コーデックを使用してこのファイルをデコードしてみましょう。

例 1:

with open("example.txt", "r", encoding="ascii") as f:
    lines = f.readlines()
    print(lines)

コードの出力:

Traceback (most recent call last):
  File "/home/fatina/PycharmProjects/examples/main.py", line 2, in <module>
    lines = f.readlines()
  File "/usr/lib/python3.10/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 0: ordinal not in range(128)

あるコーデックを使用して文字列をエンコードし、別のコーデックを使用してデコードするとどうなるかについて、別のより簡単な例を見てみましょう。

例 2:

string = "𝘈Ḇ𝖢𝕯٤ḞԍНǏ"
encoded_string = string.encode("utf-8")
decoded_string = encoded_string.decode("ascii")
print(decoded_string)

この例では、utf-8 コーデックを使用してエンコードされた文字列があり、次の行では、ascii コーデックを使用してこの文字列をデコードしようとしています。

コードの出力:

Traceback (most recent call last):
  File "/home/fatina/PycharmProjects/examples/main.py", line 4, in <module>
    decoded_string = encoded_string.decode('ascii')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 0: ordinal not in range(128)

これは、例 1 のファイルの内容と例 2 の文字列が ascii コーデックを使用してエンコードされていないために発生しますが、それを使用してこれらのスクリプトをデコードしようとしました。 これにより、UnicodeDecodeError が発生します。

Python で Unicode デコード エラーを解決する方法

この問題を解決するのはかなり簡単です。 Python のドキュメント を調べると、バイトのデコードに役立ついくつかの標準コーデックが利用できることがわかります。

したがって、上記のコード例で asciiutf-8 コーデックに置き換えると、example.txt のバイトが正常にデコードされます。

コード例:

with open("example.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    print(lines)

コードの出力:

['𝘈Ḇ𝖢𝕯٤ḞԍНǏ\n', 'hello world']

2 番目の例については、同じことを行うだけで済みます。

コード例:

string = "𝘈Ḇ𝖢𝕯٤ḞԍНǏ"
encoded_string = string.encode("utf-8")
decoded_string = encoded_string.decode("utf-8")
print(decoded_string)

コードの出力:

𝘈Ḇ𝖢𝕯٤ḞԍНǏ

1つのコーデックを使用して文字列を完全にデコードできない場合があることに注意してください。

したがって、必要に応じて、次のように ignore 引数を追加するだけで、デコードできない文字を無視するようにプログラムを開発できます。

with open("example.txt", "r", encoding="utf-8", errors="ignore") as f:
    lines = f.readlines()
    print(lines)

これにより、一部の文字のデコード中にコンパイラが遭遇するエラーはスキップされますが、これによりデータが失われる可能性があることに注意することが重要です。

この記事が、Python で UnicodeDecodeError を解決する方法を理解するのに役立つことを願っています。

著者: Abid Ullah
Abid Ullah avatar Abid Ullah avatar

My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.

LinkedIn

関連記事 - Python Error