IronPythonでShift JISのテキストファイルを取り扱う場合の注意点

全国100万人のIronPythonファンの皆さんこんばんは。

さて、IronPythonで文字コードがShift JISとなっているテキストファイルの読み込みに苦労されていませんか?

CPythonであれば以下のようなコードで問題なく読めますよね。

>>> f = codecs.open('jinkou.csv', 'r', 'shift_jis')

ところがです。IronPythonではエラーになります。

>>> f = codecs.open('jinkou.csv', 'r', 'shift_jis')
Traceback (most recent call last):
  File "", line 1, in 
  File "C:\Program Files (x86)\IronPython 2.7.1\Lib\codecs.py", line 884, in open
LookupError: unknown encoding: shift_jis

shift_jisなんて文字コードなんてしらねーぜ!ぺつってなかんじです。。。

cp932もはじかれます。

>>> f = codecs.open('jinkou.csv', 'r', 'cp932')
Traceback (most recent call last):
  File "", line 1, in 
  File "C:\Program Files (x86)\IronPython 2.7.1\Lib\codecs.py", line 884, in open
LookupError: unknown encoding: cp932

どうしてくれようかって感じですが、以下のようにコード指定をmbcsにすれば回避できます。これはコンソールのコードページが932(Shift JIS)の時にのみ有効ですけどね。

>>> f = codecs.open('jinkou.csv', 'r', 'mbcs')

‘mbcs’はWindowsのシステムロケールに依存するマルチバイト文字を指すエンコードタイプで、それが何かはWindowsのシステムロケールによります。

また、当然のことながら’mbcs’はWindows専用です。プログラムで’mbcs’を使用した段階で、Mac OS XやLinuxといった他の環境での互換性はなくなります。

そして、おもしろい物を。

IronPython 2.7.1 (2.7.0.40) on .NET 4.0.30319.488
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding
'shift_jis'
>>> sys.stdin.encoding
'shift_jis'
>>>

これを見てどうしてくれようと思いますよね。おまえ自ら’shift_jis’と言っているだろうって言う。。。

ちなみにeuc_jpもはじかれます。

>>> f = codecs.open('jinkou.csv', 'r', 'euc_jp')
Traceback (most recent call last):
  File "", line 1, in 
  File "C:\Program Files (x86)\IronPython 2.7.1\Lib\codecs.py", line 884, in open
LookupError: unknown encoding: euc_jp

結論としては、IronPythonではテキストデータはあらかじめutf-8にしておく方が無難。どうしてもshift_jisを使うならコーデックとしてmbcsを指定する。eucは。。。。

#つか標準エンコードぐらいとか思っちゃいけないんだろうか。。

種明かしすれば、よい子はわかっているように、./lib/encodingに’shift_jis.py’他がIronPythonにはないからです。
移植すればって話(実際には作る)ではあるんですけどね。。。

追記:
shift_jisのエンコードを追加しようとして、とりあえず詰んだ。どうしても多バイト文字のエンコーディング設定は今のIronPythonでは作れそうにない。エンコード毎の.pyファイルの中で文字列変換用テーブルを作り、codecs.charmap_buildという関数にそのテーブルを渡して変換マップを作るのだけど、これが255文字までしか受け付けない。しかもその関数はcodecs.pyのPythonのコードではなくて、DLLの中にある。IronPythonのC#コードから直さないといけないようだ。。。後誰か完全版なUNICODE -> shift jis変換マップをくださいw(こいつはだめみたいだし。)

追記2(2011/10/28 16:50):
mbcs、Silcerlightではどうするんだろうと思ってIronPythonのコード確認したら、案の定対応していなかった。
(参照:_codecs.cs)

また、’_codecs_cn.cs‘なんていうものがあって、中国語のエンコードには対応しているような気がする。まぁこの辺参考にすれば日本語のエンコード方法も追加できるんじゃないか的な望みはある。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください