日本語などのマルチバイト文字を、\uXXXX という形式の「ユニコードエスケープシーケンス」のみで構成されたASCII文字列に変換したい場合があります。 これは、ASCII文字しか扱えない古いシステムへのデータ送信や、設定ファイルでの文字化け防止などに利用されます。
Pythonでこれを行うには、組み込み関数の ascii() を使う方法と、文字列メソッドの .encode("unicode-escape") を使う方法の2通りがあります。
目次
1. ascii() 関数を使う方法
ascii() 関数は、オブジェクトの「ASCII文字のみで表現可能な文字列表現(repr)」を返します。非ASCII文字は自動的に \u 形式にエスケープされます。
実装例
# 変換したい日本語文字列
original_text = "富士山"
# ascii() 関数で変換
# 戻り値は文字列(str)型ですが、前後に引用符(')が付きます
escaped_text = ascii(original_text)
print(f"元の文字列 : {original_text}")
print(f"変換後 : {escaped_text}")
print(f"変換後の型 : {type(escaped_text)}")
実行結果
元の文字列 : 富士山
変換後 : '\u5bcc\u58eb\u5c71'
変換後の型 : <class 'str'>
※ ascii() の結果には、必ず前後にシングルクォート ' が付与される点に注意してください。
2. encode(“unicode-escape”) を使う方法
より実用的なデータ処理として、引用符なしの純粋なエスケープ文字列を得たい場合は、.encode() メソッドを使用します。
実装例
original_text = "富士山"
# 1. unicode-escape コーデックでエンコード
# これにより bytes型(バイト列)になります
escaped_bytes = original_text.encode("unicode-escape")
print(f"バイト列 : {escaped_bytes}")
# 2. 必要に応じて文字列(str)型にデコード
# バイト列を通常の文字列として扱いたい場合
escaped_str = escaped_bytes.decode("utf-8")
print(f"文字列化 : {escaped_str}")
実行結果
バイト列 : b'\\u5bcc\\u58eb\\u5c71'
文字列化 : \u5bcc\u58eb\u5c71
解説
使い分け
ascii(obj): デバッグログへの出力など、「中身がどんな文字コードかとりあえず確認したい」という簡易的な用途に向いています。.encode("unicode-escape"): ファイルへの保存や通信プロトコルでの利用など、「データとして正確に変換したい(引用符などが不要)」というシステム開発の用途に向いています。
逆変換(デコード)
ユニコードエスケープされた文字列(例: \u5bcc\u58eb\u5c71)を元の日本語に戻したい場合は、以下のように unicode-escape でデコードします。
s = r"\u5bcc\u58eb\u5c71" # 生の文字列として定義
print(s.encode().decode("unicode-escape")) # -> 富士山
