Open5

[Python2]unicodeとstr

que9que9

unicode to str

str_string = u'日本語'.encode('utf-8')

str to unicode

unicode_string = '日本語'.decode('utf-8')
que9que9

今使っているライブラリーはstrとunicode両方対応しているが、日本語が混じる場合はunicodeとして扱おうとするようだ?
とりあえずunicodeで出力するようにしよう。

que9que9

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)
que9que9

Pylance (Pyright) では unicode を認識してくれないのでエラーが出る。

ラッパー定義を使うのがいい。

que9que9

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.