こんにちは、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)でデコードしているために発生します。
デコードとエンコードで文字コードを揃えれば、エラーは起きません。
詳しくは以下の記事を御覧ください。