Open5
[Python2]unicodeとstr
unicode to str
str_string = u'日本語'.encode('utf-8')
str to unicode
unicode_string = '日本語'.decode('utf-8')
今使っているライブラリーはstrとunicode両方対応しているが、日本語が混じる場合はunicodeとして扱おうとするようだ?
とりあえずunicodeで出力するようにしよう。
unicodeとstrを混在してformatにかける場合の結果。
hoge.format(fuga)
というコードがある時、
hoge\fuga | str | unicode |
---|---|---|
str | OK | ERROR |
unicode | OK | OK |
という結果になった。ただしhogeがstrかつfugaがunicodeであっても、fugaがASCIIしか含まれない場合はOKになる。
まあ可読性を考えても混在させてformat使うなって話ではある。
検証コード
for kumi, hoge, fuga in (('str,str','{}','abc'),('unicode,str',u'あいうえお{}','abc'),('str,unicode','{}',u'あいうえおabc'),('unicode,unicode',u'あいうえお{}',u'あいうえおabc')):
try:
result = hoge.format(fuga)
print('OK:' + kumi)
except:
print('NG:' + kumi)
urllib.urlencode
はkeyもvalueもstrでなくてはならないようだ。
import urllib
patterns = [
[(u'日本語key'.encode('utf-8'), u'日本語value'.encode('utf-8'))],
[(u'日本語key'.encode('utf-8'), u'日本語value')],
[(u'日本語key', u'日本語value'.encode('utf-8'))],
[(u'日本語key', u'日本語value')],
]
for i in xrange(len(patterns)):
try:
out = urllib.urlencode(patterns[i])
print('{} OK.'.format(i))
print(out)
except:
print('{} NG.'.format(i))
実行結果
0 OK.
%C3%A6%C2%97%C2%A5%C3%A6%C2%9C%C2%AC%C3%A8%C2%AA%C2%9Ekey=%C3%A6%C2%97%C2%A5%C3%A6%C2%9C%C2%AC%C3%A8%C2%AA%C2%9Evalue
1 NG.
2 NG.
3 NG.