僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
LANG=ja_JP.eucJPな環境でUTF-8なテキストを開くと、
>>> open('utf-8.txt').readline() Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'euc_jp' codec can't decode bytes \ in position 0-1: illegal multibyte sequence
shift-jisも同様。iso2022-jpでは、
>>> open('iso2022.txt').readline() "\x1b$B?'$OFw$X$I;6$j$L$k$r2f$,@$C/$>>o$J$i$`\x1b(B\n"
読み込み時にencodingを指定してやればいいらしい。
>>> open('utf-8.txt', encoding='utf-8').readline() '色は匂へど散りぬるを我が世誰ぞ常ならむ\n' >>> open('iso2022.txt', encoding='iso2022_jp').readline() '色は匂へど散りぬるを我が世誰ぞ常ならむ\n' >>> open('shift.txt', encoding='shift_jis').readline() '色は匂へど散りぬるを我が世誰ぞ常ならむ\n'
'shift-jis'でも'shiftjis'でも'shift-jis'でも通った。
'iso2022-jp'の方も、同様。
クックブックの1.13で、2.x と 3.x の非互換に嵌った。
まず2.xで通る例。
>>> struct.unpack('5s 3x 8s 8s 9s', 'This is a pen, This is not a pen.') ('This ', 'a pen, T', 'his is n', 'ot a pen.')
しかし、3.xでは、
>>> import struct >>> struct.unpack('5s 3x 8s 8s 9s', 'This is a pen, This is not a pen.') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' does not support the buffer interface
2.x
と
3.x ではドキュメントがなんか違っている(要するにあまり理解できてない...)。
あれこれ試行錯誤の末、
>>> value = bytes('This is a pen, This is not a pen.', encoding='us-ascii') >>> struct.unpack('5s 3x 8s 8s 9s', value) (b'This ', b'a pen, T', b'his is n', b'ot a pen.') >>> btup = struct.unpack('5s 3x 8s 8s 9s', value) >>> tuple([x.decode() for x in btup]) ('This ', 'a pen, T', 'his is n', 'ot a pen.')
なんかひどい回り道みたいな気がするが、どうにか同じ結果が返るようにはなった。
ちなみに2to3では解決できなかった。
引数の大きさの意味が分かるまでしばらくかかった。
引数が小さすぎると、中央しか表示できないようだ。
>>> for x in range(9): ... print(x, ': ', end='') ... print('警告'.center(x,'!')) ... 0 : 警告 1 : 警告 2 : 警告 3 : !警告 4 : !警告! 5 : !!警告! 6 : !!警告!! 7 : !!!警告!! 8 : !!!警告!!!
ljustやrjustも同様。
>>> かな = ''.join([chr(x) for x in range(12353,12436)]) >>> [かな[k:k+5] for k in range(0, len(かな), 5)] ['ぁあぃいぅ', 'うぇえぉお', 'かがきぎく', 'ぐけげこご', 'さざしじす', \ 'ずせぜそぞ', 'ただちぢっ', 'つづてでと', 'どなにぬね', 'のはばぱひ', \ 'びぴふぶぷ', 'へべぺほぼ', 'ぽまみむめ', 'もゃやゅゆ', 'ょよらりる', \ 'れろゎわゐ', 'ゑをん']
片仮名は12249から12535(未満)で出た。合計86文字。
'ヶ','ヵ','ヴ'は平仮名にはないみたい。
<訂正>
[ chr(x) for x in range(12449,12535)]だった。
</訂正>
<訂正2>
平仮名にないのではなく、JIS X 0208にないだけである。
</訂正2>
<訂正3>
<訂正1> は、カナだった。
かななら、range(12353,12439) だ。
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。