トップ «前の日記(2010-06-23(Wed)) 最新 次の日記(2010-06-27(Sun))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2010-06-26(Sat) ようやく梅雨どきらしくなってきた

エンコード?

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) だ。

おまけ

>>> 'あ' * 3
'あああ'
 
>>> 3 * 'い'
'いいい'

そうなのか。へぇ、そうなんだ。


リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。

index.htmlは ここから。