ウニ’s blog

勉強した結果を書いていきます

【Python3】文字列を\uを含む文字列に変換する。元に戻す。

jsonデータを展開したら\uを含む文字列が出てくる。
\uはunicodeの表現だということは分かるんだが、そもそも文字列がどういう状態になっているのかイマイチ分からない。
そこでPython3上でどんな扱いなのか調査した。結果は以下。

\uを含む文字列とは

文字列中の非 ASCII 文字を\uでエスケープした状態
2. 組み込み関数 — Python 3.5.2 ドキュメント

\uを含む文字列を作る

a = 'あ'
print(a, type(a))  # あ <class 'str'>

b = ascii(a)
print(b, type(b))  # '\u3042' <class 'str'>

\uを含む文字列を戻す(エスケープを戻す)

a = 'あ'
print(a, type(a))  # あ <class 'str'>

b = ascii(a)
print(b, type(b))  # '\u3042' <class 'str'>

import codecs
cc = codecs.decode(b, 'unicode-escape')
print(cc)  # 'あ' <class 'str'>

(※ encode().decode()からcodecs.decode()に改定)

まとめ

参考記事にあるように、そもそも\uエスケープが出ないようにするのが良いらしい。処理を見直そう。

おまけ

以下の挙動のおかげでものすごいハマってしまったのが発端

\uエスケープを含むリテラルな文字列は自動判別される

# リテラルな文字列はPythonが勝手にエスケープを戻す
d = '\u3042'
print(d, type(d))  # あ <class 'str'>

# 非リテラルはエスケープされたまま
b = ascii('あ')
print(b, type(b))  # '\u3042' <class 'str'>