Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

【Pythonお悩み解決】UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128) とは何ですか?

こんにちは、PyQサポートです。

今回は UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128) というエラーの意味と、その解消方法を解説します。
文字列をエンコードするときに、このようなエラーになることがあります。早速、質問を見ていきましょう。

質問: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)というエラーはどういうものですか?

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128) というエラーが出ました。どのように直したら良いでしょうか?

入力した内容(コード)

"こんにちは".encode("ascii")

出たエラー(実行結果)

Traceback (most recent call last):
  File "/Users/pyq/scripts/encode.py", line 1, in <module>
    "こんにちは".encode("ascii")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

回答:ASCIIに対応していない文字列をエンコードしているためです

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)UnicodeEncodeErrorとあるように、「文字列のエンコード」に関するエラーです。

今回は「こんにちは」のような日本語の文字列を「ASCII」という文字コードでエンコードしようとして、このエラーが発生しました。

このエラーを理解するには、文字列のエンコード(encode) について知る必要があります。

文字列のエンコードとは

ファイルを読み書きするときなど、文字はバイト列で表されます。

文字とバイト列の対応関係は「文字コード」と呼ばれ、今回エラーが発生した「ASCII」も文字コードの1つです。

文字コードには他にもさまざまな種類がありますが、現在は「UTF-8」「Shift_JIS」などがよく使われています。

たとえば、「こんにちは」という文字列のバイト列(UTF-8の場合)は以下のようになります。

>>> "こんにちは".encode("utf-8")
b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf'

このように文字列を特定の文字コードで変換することを「エンコード」 と言います(これを「文字エンコーディング」とも言います)。

上記の例であれば、「こんにちは」という文字列を「UTF-8」でエンコードした、ということです。

なぜASCIIでエンコードできなかったのか?

文字コードが表現する文字の集合を「文字集合」と言い、前述の「UTF-8」や「Shift_JIS」はその文字集合に「日本語文字」を含みます。

それに対し「ASCII」の文字集合は英数字が主で、日本語文字は含まれていません

そのため、「こんにちは」という文字列を「ASCII」でエンコードしようとすると、エンコードできずにUnicodeEncodeErrorとなるのです。

類似のケース:ファイルへの書き込み

今回の例では、文字列のencode()メソッドを使ってエンコードしました。

類似のケースとして、ファイルへの書き込み時に同様のエラーになることがあります。

>>> with open("sample.txt", mode="w", encoding="ascii") as f:
...     f.write("こんにちは")
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

ファイル書き込み時にも、open()関数のencodingに指定した文字コードでエンコードが行われるためです。

UnicodeEncodeErrorが発生した場合は、文字コードの指定が適切かを確認しましょう。

類似エラー:UnicodeDecodeError: 'cp932' codec can't decode byte 0x9e in position 8: incomplete multibyte sequence

UnicodeDecodeError: 'cp932' codec can't decode byte 0x9e in position 8: incomplete multibyte sequenceというエラーは、文字コード UTF-8 でエンコードしたバイト列を、文字コード cp932 (Microsoftコードページ932)でデコードしているために発生します。

デコードとエンコードで文字コードを揃えれば、エラーは起きません。
詳しくは以下の記事を御覧ください。

blog.pyq.jp

Copyright ©2017- BeProud Inc. All rights reserved.