APIのレスポンスやサーバーの生ログなど、日本語が \uXXXX 形式(ユニコードエスケープ)で記録されているデータを、Pythonの codecs モジュールを使用して本来の文字列に復元(デコード)する方法を解説します。
ここでは、サーバーから受信した「ステータスコード」の文字列を解析するシステムを想定して実装します。
目次
実装例:サーバーレスポンスの解析
サーバーから受信した生データ(文字列)に含まれるエスケープシーケンスを、人間が読める形式に変換します。
ソースコード
import codecs
# 1. 受信した生データ(ユニコードエスケープされた文字列)
# 想定: "認証成功" というメッセージがエスケープされている
# \u8a8d (認), \u8a3c (証), \u6210 (成), \u529f (功)
raw_response = "\\u8a8d\\u8a3c\\u6210\\u529f"
print(f"受信データ : {raw_response}")
print("-" * 30)
# 2. codecs.decode を使用したデコード処理
# 手順A: まず文字列をバイト列(bytes)に変換する (encode)
# 手順B: codecs.decode で 'unicode-escape' を指定して復元する
# ※ codecs.decode(obj, encoding) は、バイト列を受け取って文字列を返します
# バイト列への変換
encoded_bytes = raw_response.encode('utf-8')
# デコードの実行
decoded_message = codecs.decode(encoded_bytes, 'unicode-escape')
print(f"解析結果 : {decoded_message}")
print(f"結果の型 : {type(decoded_message)}")
# 3. (参考) 処理の判定などへの利用
if decoded_message == "認証成功":
print(">> システムへのログインを許可します。")
実行結果
受信データ : \u8a8d\u8a3c\u6210\u529f
------------------------------
解析結果 : 認証成功
結果の型 : <class 'str'>
>> システムへのログインを許可します。
解説
codecs.decode(obj, encoding)
標準ライブラリの codecs モジュールを使用することで、明示的にエンコーディングを指定して変換を行います。
- 入力: バイト列(
bytes)である必要があります。そのため、変数が文字列(str)の場合は、一度.encode()してバイト列に変換してからcodecs.decodeに渡します。 - encoding=”unicode-escape”: これを指定することで、
\uXXXXという文字の並びを、対応するUnicode文字(日本語など)として解釈し直します。
活用シーン
JSONデータのパースエラー時や、Javaプロパティファイルの読み込みなど、非ASCII文字がエスケープされた状態で渡ってくるシステムの連携部分で頻繁に使用されます。
