Unicodeとは
文字列をUnicodeのバイト列に変換したい
Unicodeのバイト列を文字列に変換したい
Unicodeと聞くと、なんだか難しそうなイメージを受ける方も多いかもしれません。そもそもUnicodeについてよくわかっていなかったり、使い方がわからなかったり、Unicodeに変換するってどういうことがいまいちわからない…なんて方が多いのではないでしょうか?
そこで、この記事ではUnicodeについて、基本的な解説から文字列、バイト列の変換方法までわかりやすく解説いたします。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
Unicodeとは
まずはUnicodeとはどういうものかについて、知っておきましょう。Unicodeは文字コードの中の一つの規格になります。
よく「Unicode = 文字コード」と間違われやすいのですが、Unicodeは文字の集合であるということを知っておきましょう。Unicodeを表すために、UTF-8などの符号化方式が用意されています。
詳しくはこちらの記事をご覧ください。
文字列をUnicodeのバイト列に変換する方法
それでは文字列をUnicodeのバイト列に変換してみましょう。バイト列はPythonではbytes型として用意されています。
こちらのコードを見てみましょう。
word = "こんにちは" enc = word.encode('unicode-escape') print(enc) print(type(enc))
実行結果
b'u3053u3093u306bu3061u306f' # 表示されたバイト列 <class 'bytes'> # bytes型の確認
文字列型のencodeメソッドを使うことでUnicodeエスケープされたバイト列を作ることが出来ましたね。
引数に指定した「unicode-escape」はPython独自のエンコーディング方式なのでPython以外では使えないということに気をつけましょう。
Unicodeのバイト列を文字列に変換する方法
次は先程の操作の逆、Unicodeのバイト列を文字列に変換してみましょう。
こちらのコードをご覧ください。
word = "こんにちは" enc = word.encode('unicode-escape') dec = enc.decode('unicode-escape') print(dec) print(type(dec))
実行結果
こんにちは # バイト列から変換された文字列 <class 'str'> # str型(文字列型)の確認
このように先程の動作の逆をすることが出来ましたね。
これまでの操作から、
- 文字列 → バイト列をエンコード
- バイト列 → 文字列をデコード
と呼ぶことを知っておきましょう。
UnicodeEncodeErrorについて
これまで文字列とバイト列を扱う方法について見てきましたが、このバイト列は基本的には扱うことはありません。
ただ、Python内部で完結する場合は文字コードを不用意に触る必要は無いという意味で、外部ファイルから文字を扱う場合はバイト列として扱ったほうが良い場合もあります。
そしてこれまでの結果から、Unicodeを扱えるstr型(文字列型)と、その他のエンコーディング方式を扱うことの出来るbytes型があることもわかりました。
これらの変換がうまくいかないとき、UnicodeEncodeErrorが起きるときがあります。Pythonの内部ではprint関数などで出力をするときに、自動的にシステムのエンコーディング方式に合わせて表示しようとします。
そのバイト列にUnicodeに無い(変換できない)部分があると、UnicodeEncodeErrorが発生します。このエラーはシステムのエンコーディング方式がUTF-8ではなくCP932が採用されているWindowsで発生しやすいエラーになります。
そしてこのエラーが出るとエラーが出た箇所のバイト列を削除する必要が出てきてしまいます。基本的にはPythonの内部ではUTF-8を使うことを心がけましょう。
また外部ファイルを使う場合はcodecsモジュールのopenメソッドを使ってエンコーディング方式を指定して使うようにしましょう。
まとめ
今回はPythonでUnicodeをエンコード、デコードする方法について解説してきました。UnicodeとUTF-8等の文字列との関係についてもわかって頂けたかと思います。
普段のプログラミングではあまり触れない部分かもしれませんが、知っておいて損はありません。もし文字列のエンコード、デコードについて忘れてしまった場合は、ぜひまたこの記事を読んでみてください。