PythonでUnicodeエスケープされた文字列・バイト列を効率的に変換
Unicodeエスケープとは?
プログラム内で特殊な文字や非ASCII文字を表現する際、直接それらの文字を記述する代わりに、Unicodeエスケープシーケンスが使われることがあります。これは \uXXXX や \xXX といった形式で、対応するUnicode文字のコードポイントを表します。
例えば、JSONデータやAPIレスポンスなどで、日本語などの文字がエスケープされた形式で送られてくることがあります。これを人間が読める形式に、あるいはプログラムで処理しやすい形式に変換する必要があります。
エスケープされた文字列の変換
Pythonでは、エスケープシーケンスを含む文字列を通常の文字列に変換する方法がいくつかあります。
encode().decode()を利用した変換
最も一般的な方法は、文字列を一度バイト列にエンコードし、そのバイト列を再度デコードする方法です。特に、文字列が \u や \x の形式でエスケープされている場合、latin-1 エンコーディングを使ってデコードすることで、エスケープシーケンスが適切に処理されます。
# \u でエスケープされた文字列の例
escaped_str = 'Hello, \\u3042\\u3044\\u3046!'
# encode('latin-1')でバイト列にし、decode('unicode_escape')でデコード
# Note: 'unicode_escape'は文字列リテラル解析と同じエスケープシーケンスを処理します
decoded_str = escaped_str.encode('latin-1').decode('unicode_escape')
print(decoded_str)
# \x でエスケープされた文字列の例
escaped_hex_str = 'ABC\\x44EF'
decoded_hex_str = escaped_hex_str.encode('latin-1').decode('unicode_escape')
print(decoded_hex_str)
この方法では、\\u のようにバックスラッシュがエスケープされている(つまり\自体もエスケープ文字として扱われている)文字列に対しても有効です。
ast.literal_eval() を利用した変換
ast.literal_eval() 関数は、文字列内のPythonリテラルを安全に評価し、対応するPythonオブジェクトに変換します。これにより、エスケープされた文字列も適切な形に変換できます。この方法は、文字列がPythonの文字列リテラルとして有効な形式である場合に特に便利です。
import ast
# Python文字列リテラルとして有効な形式
escaped_literal_str = '"Hello, \\u3042\\u3044\\u3046!"'
decoded_literal_str = ast.literal_eval(escaped_literal_str)
print(decoded_literal_str)
# 直接文字列としてエスケープされた場合(クォーテーションがない場合)は注意
# ast.literal_evalは文字列リテラルを期待するため、クォーテーションが必要です
# 例: ast.literal_eval('\\u3042') は SyntaxError になります。
ast.literal_eval() は安全な評価が求められる場合に推奨されますが、入力文字列が必ずPythonリテラル形式である必要があります。
エスケープされたバイト列の変換
バイト列の場合、エスケープシーケンスは通常、エンコードされた結果として現れます。これを人間が読める文字列に変換するには、適切なデコードが必要です。
decode()メソッドを利用した変換
バイト列が特定のエンコーディング(例: UTF-8, Shift_JIS)でエンコードされている場合、そのエンコーディングを指定して decode() メソッドを使用します。
# UTF-8でエンコードされたバイト列の例
byte_data = b'Hello, \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86!' # 'あいう' のUTF-8バイト列
decoded_bytes = byte_data.decode('utf-8')
print(decoded_bytes)
バイト列が \x のような16進数エスケープの形式で表現されている場合、bytes.fromhex() を使うことも考えられますが、これは直接的なエスケープシーケンスのデコードとは異なります。通常は、unicode_escape デコーディングがより適切です。
状況に応じて最適な変換方法を選択することで、エスケープされたUnicode文字を含むデータを効率的に処理できます。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座



