もう一つの移行作業

PyGI GTK3だけでなく, ninix-ayaをもう一つ大きな変化が待ち受けています. Python3000です.

少し前のバージョンからPython3を意識してコーディングしていたのでほとんどの箇所は2to3で直せる程度の変更しかないと思いますが, 大きな問題が一つあります.

それは文字コードです.

Python3ではファイルのopen()時点で文字コードが分かっていればそれを指定することでstrが得られるので簡単ではあるのですが, ファイルの中身を見るまで文字コードが分からない場合(ファイル内に文字コードの指定が書いてある場合)は一旦bytesとして読む必要が出てきます.

というのは, やれば出来る話なので問題ではありません. 実は別の所で問題が起きています.

ninix-ayaの中には’Shift_JIS’という指定が沢山あるのですが, これ本当は’CP932’でないとまずいんです.

問題になるケースはこんな感じです. まず, CP932で書かれた次のような内容のtest.txtを準備します. これはあるゴーストの辞書内で実際に使われている文字列です.(ゴースト名が分かる人は結構長く界隈にいますね.)

㌍㌢

このファイルをPython2とPython3で開いて読んでみましょう.

Python2では次のようになります.
>>> f = open(‘test.txt’)
>>> f.read()
‘\x87i\x87a\r\n’

Python3で”Shift_JIS”と”CP932″それぞれを指定してみると違いが出ます.

>>> f = open(‘test.txt’, encoding=’Shift_JIS’)
>>> f.read()
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
UnicodeDecodeError: ‘shift_jis’ codec can’t decode bytes in position 0-1: illegal multibyte sequence

>>> f = open(‘test.txt’, encoding=’cp932′)
>>> f.read()
‘㌍㌢\n’

ちなみにbytesとして読むと次のようになります.

>>> f = open(‘test.txt’, ‘rb’)
>>> f.read()
b’\x87i\x87a\r\n’

以前から文字コード関係は苦労してきたんですが, まだまだ続きそうですね.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です