機種依存文字対策でpykfをインストールしてみた
Pythonで「①」とか「㍑」なんかの機種依存文字を扱えるようにするため、ネットで見つけた pykfをインストールしたので、その顛末メモ。
Pythonの環境
- Windows XP
- Python 2.7
pykfインストール
PyKfの作者のpykfをPyPIに登録 – atsuoishimotoの日記によると、easy_installでインストールできるとのこと。で、やってみた。
C:\WINDOWS\system32>easy_install pykf Searching for pykf Reading http://pypi.python.org/simple/pykf/ Reading http://sourceforge.jp/projects/pykf/ Best match: pykf 0.3.5 Downloading http://pypi.python.org/packages/source/p/pykf/pykf-0.3.5.zip#md5=eb1b219e395847003c41114ef02b1c64 Processing pykf-0.3.5.zip Running pykf-0.3.5\setup.py -q bdist_egg --dist-dir c:\docume~1\skw\locals~1\temp\easy_install-lphqcz\pykf-0.3.5\egg-dist-tmp-2huubk error: Setup script exited with error: Unable to find vcvarsall.bat
エラーがでてしまった。Windows XPな環境ではちょっと違うらしい、とあきらめかけたが、
Python: Unable to find vcvarsall.batによると、Visual C++ 2008 Express Edition with SP1をインストールすればエラーがでなくなるらしい。2010では駄目で、2008にするようにと書いてある。リンクから素直に2008をインストールした。
再度、easy_installでチャレンジ
C:\Documents and Settings\skw>easy_install pykf Searching for pykf Reading http://pypi.python.org/simple/pykf/ Reading http://sourceforge.jp/projects/pykf/ Best match: pykf 0.3.5 Downloading http://pypi.python.org/packages/source/p/pykf/pykf-0.3.5.zip#md5=eb1 b219e395847003c41114ef02b1c64 Processing pykf-0.3.5.zip Running pykf-0.3.5\setup.py -q bdist_egg --dist-dir c:\docume~1\skw\locals~1\tem p\easy_install-tvxuft\pykf-0.3.5\egg-dist-tmp-2hseyz pykf.c converter.c jis0213.c mskanji.c ライブラリ build\temp.win32-2.7\Release\src\pykf.lib とオブジェクト build\tem p.win32-2.7\Release\src\pykf.exp を作成中 zip_safe flag not set; analyzing archive contents... Adding pykf 0.3.5 to easy-install.pth file Installed c:\python27\lib\site-packages\pykf-0.3.5-py2.7-win32.egg Processing dependencies for pykf Finished processing dependencies for pykf
今度はエラー無しにインストールできた。もう一息。
使い方 - よくわからないけどテストしてみる
今度はエラー無しにインストールできた。でも使い方の説明が見つからないので、どんな関数、変数が定義されているのか、いちおう調査の真似事。
C:\home\py\pykf>python Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win 32 Type "help", "copyright", "credits" or "license" for more information. >>> import pykf >>> dir(pykf) ['ASCII', 'ERROR', 'EUC', 'IllegalEncoding', 'JIS', 'SJIS', 'UNKNOWN', 'UTF16', 'UTF16_BE', 'UTF16_LE', 'UTF8', '__builtins__', '__doc__', '__file__', '__name__ ', '__package__', 'getdefault', 'getstrict', 'guess', 'setdefault', 'setstrict', 'split', 'toeuc', 'tofull_kana', 'tohalf_kana', 'tojis', 'tosjis'] >>>
なんとなく、jisに変換するにはtojis()、sjisに変換するはtosjis()らしい、ことがわかった。unicodeやutf-8にダイレクトで変換できないぽい。
今必要なのは、機種依存文字の入ったjis(iso-2022-jp)コード文字列をunicodeに変換する機能なので、jis(iso-2022-jp) -> sjis(cp932) -> unicode の順番でコード変換することにする。
# -*- coding:utf-8 -*- import pykf # #unicodeのテスト文を作る # u_str = u"これはJISの機種依存文字①㍑のテスト文だよ" print u_str #テスト文をcp932に変換する。 #機種依存文字が入っていてもcp932なので問題無し #sjisでエンコードしようとすると失敗する # cp932_str = u_str.encode('sjis') cp932_str = u_str.encode('cp932') print cp932_str #pykfでcp932の文字列をjisに変換する jis_str = pykf.tojis(cp932_str) #jis -> unicode with pykf #pykfでjisの文字列をs-jisに変換し後、cp932でデコードしてunicodeにする u_str_pykf = unicode(pykf.tosjis(jis_str),'cp932') print u_str_pykf #jis -> unicode #jisの文字列をiso-2022-jpでデコードするとき、機種依存文字があるため失敗する u_str_std = unicode(jis_str,'iso-2022-jp') print u_str_std
自分の環境で実行すると、結果は以下のとおり。最後のエラーは機種依存文字を含むjis文字列をunicode関数でデコードしようとして失敗している。それよりひとつ前のpykfでは無事に変換できているようです。いい感じです。
C:\home\py\pykf>tes.py これはJISの機種依存文字①㍑のテスト文だよ これはJISの機種依存文字①㍑のテスト文だよ これはJISの機種依存文字①㍑のテスト文だよ Traceback (most recent call last): File "C:\home\py\pykf\tes.py", line 32, in <module> u_str_std = unicode(jis_str,'iso-2022-jp') UnicodeDecodeError: 'iso2022_jp' codec can't decode bytes in position 32-33: ill egal multibyte sequence