【Python入門】Python ユニコード文字列と変換方法について – Python初心者勉強記016
第13回・第14回・第15回とPythonの文字列の操作を見てきましたが、今回で文字列は最後です。ユニコード文字列について見ていきたいと思います。
Python文字列型の種類
Pythonの文字列型には、バイト文字列とUnicode文字列の2種類がありますが、Python2系ではバイト文字列がデフォルトとなります。(Python3系ではUnicodeがデフォルト)
このバイト文字列では、日本語や中国語などの文字の境界を適切に判断できないため、検索や置換などの処理で不具合が発生する場合があります。
これらの問題を解決するために、Unicode文字列を使用します。
Unicode文字列の基本
Unicodeは18ビットで1文字を表現するため、文字列中に複数の言語が混在していても問題なく検索や置換を行うことができます。
>>> u'あいう'
u'\u3042\u3044\u3046'
>>> print(u'あいう')
あいう
>>> len('日本語')
9
>>> len(u'日本語')
3
基本的には普通の文字列と同様の扱いで大丈夫です。バイト文字列のメソッドは、全角文字に対応していませんでしたが、Unicode文字列のメソッドは全角文字でも問題なく変換することができます。
>>> print(u'abc'.upper())
ABC
>>> print(u'abc'.title())
Abc
>>> print(u'あいabc'.title())
あいAbc
Unicode文字列への変換
unicode関数とdecodeメソッドは、通常の文字列をUnicode文字列に変換します。
unicode(Unicodeに変換する文字列, エンコード名, エラー処理方法)
.decode(エンコード名, エラー処理方法)
エンコード名を指定しない場合にはデフォルトエンコーディングが使用されます。
エラー処理方法の指定は以下のようです。
strict : 通常通り例外を発生(デフォルト)
ignore : エラーを無視
replace : エラーが出た場合は「?」などで置換
>>> unicode('あいう','utf-8')
u'\u3042\u3044\u3046'
>>> 'あいう'.decode('utf-8')
u'\u3042\u3044\u3046'
>>> 'あいう'.decode('euc_jp','replace')
u'\ufffd\ufffd\ufffd\ufffd\ufffd'
Unicodeから通常文字列への変換
str関数とencodeメソッドは、Unicode文字列を通常の文字列に変換します。
str(Unicode文字列)
.encode(エンコード名, エラー処理方法)
エンコード名を指定しない場合にはデフォルトエンコーディングが使用されます。
エラー処理方法の指定は以下のようです。
strict : 通常通り例外を発生(デフォルト)
ignore : エラーを無視
replace : エラーが出た場合は「?」などで置換
xmlcharrefreplace : XML文字参照で置換
backslashreplace : バックスラッシュ付きのエスケープシーケンスで置換
>>> u'あいう'.encode('shift_jis')
'\x82\xa0\x82\xa2\x82\xa4'
(追記)Python3系
Python3からデフォルトの文字列がUnicodeになり、それまでのバイト文字列がbytes型とbytearray型として新たに定義されています。
この変更によりファイルの内容を取得する時にエンコーディングの指定が必須となりました。
Python入門講座の次の記事はこちら => 【Python入門】ファイル操作の基本と変数への代入 – Python初心者勉強記017