String文字列を他の文字コードに変換しようとしてハマった話(Python2)
今回はPython2でString文字列を他の文字コードに変換する方法について、自らのハマった経験を踏まえご紹介いたします。
String文字列を他の文字コードに変換しようとしてハマった話(Python2)
Python3だとでString文字列を他の文字コードに変更したいときに、素直にString文字列をencode('shift-jis’)などとすれば文字コードを変換できるのですが、Python2だとそうもいきません。
Python2だとUnicodeDecodeError: 'ascii’ codec can’t decode byte 0xe3 in position 0: ordinal not in range(128)というエラーが発生してしまいます。
次の例はPython2の対話型シェルでString文字列をShift JISの文字コードに変換しようとした結果です。
1 2 3 4 5 6 |
>>> testString = 'あああ' >>> testString = testString.encode('shift-jis') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128) >>> |
ちなみにPython3だとうまくいきます。
下記のコードはPython3の場合のお試しコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
testString = 'あああ' print('-testString-') print(testString) print('-type testString-') print(type(testString)) print('') testString = testString.encode('shift-jis') print('-testString-') print(testString) print('-type testString-') print(type(testString)) |
Python3の場合の上記のコードの実行結果はこちらです。
1 2 3 4 5 6 7 8 9 |
-testString- あああ -type testString- <class 'str'> -testString- b'\x82\xa0\x82\xa0\x82\xa0' -type testString- <class 'bytes'> |
では、Python2でString型の文字列をShift JISの文字コードに変換するためにはどうすれば良いのかというと、結論としてdecode('utf-8’)を間に挟む必要があります。
上記の例では、
testString = testString.decode('utf-8’).encode('shift-jis’)
とする必要があります。
以下、対話型シェルでいろいろ試してみた結果です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
>>> testString = 'あああ' >>> testString '\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82' >>> type(testString) <type 'str'> >>> >>> testString = testString.decode('utf-8') >>> testString u'\u3042\u3042\u3042' >>> type(testString) <type 'unicode'> >>> >>> testString = testString.encode('shift-jis') >>> testString '\x82\xa0\x82\xa0\x82\xa0' >>> type(testString) <type 'str'> >>> |
上記のようにうまくいっていることが分かると思います。
終わりに
今回はPython2でString文字列を他の文字コードに変換する方法についてご紹介いたしました。
ディスカッション
コメント一覧
まだ、コメントがありません