機種依存文字対策でpykfをインストールしてみた

2011/10/07

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

Python,未分類

Posted by skw