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
はいける。
押さえておきたい書籍
- 作者: 柴田淳
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2012/08/29
- メディア: 単行本
- 購入: 1人 クリック: 13回
- この商品を含むブログ (34件) を見る
プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)
- 作者: 矢野啓介
- 出版社/メーカー: 技術評論社
- 発売日: 2010/02/18
- メディア: 単行本(ソフトカバー)
- 購入: 34人 クリック: 578回
- この商品を含むブログ (126件) を見る
本場 中国 の頼りになる 【篆刻 字典】 (786ページ, ソフトカバー)
- 出版社/メーカー: ワクワクサンタ ~ delivering happiness ~
- メディア: その他
- この商品を含むブログを見る