メモ用サブブログ

子曰わく學びて時にこれを習う。

Python2.7.x AsciiとUnicodeの組み合わせの挙動

>>> "test"+"a"
'testa'
>>> "test"+u"2"
u'test2'
>>> "test"+u"あ"
u'test\u3042'
>>> "test{}".format(u"あ")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u3042' in position 0: ordinal not in range(128)
>>> "test{}".format(u"a")
'testa'
>>> u"てすと{}".format("test")
u'\u3066\u3059\u3068test'

詳解

Ascii同士の結合

>>> "test"+"a"
'testa'

問題なし

Ascii+Unicode(Ascii範囲)の結合

>>> "test"+u"2"
u'test2'

暗黙的にUnicode型にキャストされる。

Ascii+Unicodeの結合

>>> "test"+u"あ"
u'test\u3042'

暗黙的にUnicode型にキャストされる。

AsciiにformatメソッドでUnicodeを挿入

>>> "test{}".format(u"あ")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u3042' in position 0: ordinal not in range(128)

asciiでエンコードできねえよ、というエラーになる。暗黙的にUnicode型に変換してくれない。

AsciiにformatメソッドでUnicode(Ascii範囲)を挿入

>>> "test{}".format(u"a")
'testa'

暗黙的にAscii方に変換。エラー出ず。

UnicodeにformatメソッドでAsciiを挿入

>>> u"てすと{}".format("test")
u'\u3066\u3059\u3068test'

暗黙的にUnicodeに変換。エラー出ず。

まとめ

  • +演算子なら暗黙的にやってくれる。
  • フォーマットメソッドの場合Ascii <= Unicodeは駄目なのにUnicode <= Asciiはいける。

押さえておきたい書籍

みんなのPython 第3版

みんなのPython 第3版

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

本場 中国 の頼りになる 【篆刻 字典】 (786ページ, ソフトカバー)

本場 中国 の頼りになる 【篆刻 字典】 (786ページ, ソフトカバー)