UnicodeTweet\u3042のように\uと4桁の16進数からなるUnicodeエスケープシーケンスを含む文字列・バイト列を相互に変換する方法を説明する。Python3の場合について、以下の内容を説明する。通常の文字列をUnicodeエスケープされた文字列に変換Unicodeエスケープシーケンスをprint()でそのまま出力Unicodeエスケープされた文字列を含むファイルを読み込みJSONのUnicodeエスケープUnicodeコードポイント(文字コード)と文字を相互に変換する方法については以下の記事を参照。\U)スポンサーリンク文字列をUnicodeエスケープされたバイト列に変換(エンコード)文字列からバイト列への変換(エンコード)は文字列(str型)のメソッドencode()を使う。Unicodeエスケープされたバイト列へエンコードする場合は、第一引数encodingに'unicode-escape'を指定する。ハイフンではなくアンダースコアの'unicode_escape'でもOK。unicode-escapeはPython特有のエンコーディング。Python2ではstring-escapeという名称だった。unicode_escape.pyUnicodeエスケープされたバイト列を文字列に変換(デコード)バイト列から文字列への変換(デコード)はバイト列(bytes型)のメソッドdecode()を使う。エンコードと同じく第一引数encodingに'unicode-escape'を指定するとUnicodeエスケープされたバイト列が元の文字列に戻る。unicode_escape.pyUnicodeエスケープされた文字列を通常の文字列に変換Unicodeエスケープされたバイト列をutf-8でデコードすると、Unicodeエスケープのまま文字列に変換される。引数encodingのデフォルト値は'utf-8'なので省略しても同じ結果。unicode_escape.pyこのような文字列は、encode()でバイト列に変換してから再度decode()で文字列に変換すると、Unicodeエスケープされていない文字列に戻る。unicode_escape.py標準ライブラリのcodecsモジュールを使って直接変換することも可能。unicode_escape.pyなお、ここでは説明のためにUnicodeエスケープされた文字列を作成したが、本来はUnicodeエスケープ(\u)が残らないようにしておくべき。大元の処理(バイト列からのデコード)を修正できる状況であればそちらを修正したほうがいい。通常の文字列をUnicodeエスケープされた文字列に変換Unicodeエスケープシーケンス(\uXXXX)を確認したい場合は、組み込み関数ascii()を使う。文字が\uでエスケープされる。ドキュメントascii()は先頭と末尾に引用符'を含んだ文字列(\uXXXXの6文字分とあわせて8文字)を返す。unicode_escape.py以下の文字列と等価。unicode_escape.py引用符を取り除きたい場合はスライスを使う。unicode_escape.pyUnicodeエスケープシーケンスをprint()でそのまま出力Unicodeエスケープシーケンス(\uXXXX)は文字列(str型)中にそのまま記述すると対応する文字一文字分として扱われ、print()では対応する文字が出力される。unicode_escape.pyそのまま出力したい場合は、バックスラッシュを\\で表すか、エスケープシーケンスを無視するraw文字列を使う。unicode_escape.pyUnicodeエスケープされた文字列を含むファイルを読み込み\u3042\u3044\u3046\u3048\u304aという文字列のテキストファイルを読み込む。Pythonでファイルの読み込み、書き込み(作成・追記)open()の引数encodingを設定しないとそのまま読み込まれる。unicode_escape.pyencoding='unicode-escape'とすると対応する文字列に変換される。APIでjsonなどを取得する場合。標準ライブラリのurllib.requestモジュールの関数urllib.request.urlopen()はバイト列(bytes型)を返す。Unicodeエスケープされたバイト列をdecode()メソッド文字列に変換(デコード)する場合、第一引数encodingに'utf-8'を指定すると(引数を省略した場合も'utf-8')、Unicodeエスケープシーケンス(\uXXXX)を含んだ文字列となる。上で説明したように、第一引数encodingに'unicode-escape'を指定すればよい。標準ライブラリのjsonモジュールのloads()関数を使って、JSON形式の文字列を辞書(dict型オブジェクト)に変換する場合は、Unicodeエスケープシーケンスを含んだ文字列のままでOK。loads()関数の内部でUnicodeエスケープシーケンスを変換してくれる。unicode_escape.pyバージョン3.6からはloads()の引数にバイト列(bytes型)を指定できるようになったので、Unicodeエスケープされたバイト列もそのまま指定可能。utf-32から自動判別してバイト列をデコードしている。utf-32以外でエンコードされたバイト列の場合は、loads()に直接渡すのではなく、decode()メソッドでエンコーディングを指定してデコードする必要があるので注意。