作者: 機械伯爵
日時: 2005/10/18(09:51)
 機械です。
 Python2.3 系を使う際に、どうしても気になるのが日
本語の扱い。
 別途日本語コデック (JapaneseCodecs) を使って指定
しないで、コードに2バイトコードが混じってると即エ
ラーとなります。
 2.4 系には日本語コデックが付属してきますが、2.3
系には無いので別途インストールする必要がでてきます。
 また、2.4 系をポータブルな最小コンポーネントで動
かす時にも不便です。
 そこで、コンソールに返り値を表示するのに用いる repr
関数を用いて(悪用して?)2バイトコード部分を全て
アスキー表示に変換するスクリプトを考えてみました。
 原理は以下のとおり。

 Python インタープリタモードで日本語(今回は Windows
なので SJIS)を打ち込むと、以下のようになります。

>>> s = "print 'こんにちわ'"
>>> s
"print '\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xed'"
>>> print s
print 'こんにちわ'
>>>

 最初に s を表示した場合、内部表現を表示するわけで
すが、ここで暗黙的に使われているのが repr 関数です。
 repr 関数では、非 ASCII 文字に対しては、上のよう
にコードのエスケープ文字表現に変換されます。
 エスケープ文字は、そもそも非 ASCII コードを打ち込
むために使うわけですから、これをそのまま打ち込めば
2バイトコードの文字になるわけです。
 こうして表示されるのは文字列ですから、これをファ
イルに打ち出せば、日本語部分だけ変換されたコードの
出来上がり、というわけです。
 以下、スクリプトです。

# j2a.py:Japanese to ASCII
import sys

inputFileName = sys.argv[1]
outputFileName = inputFileName[:-3] + 'py'

fi = file(inputFileName)
si = fi.readlines()
fi.close()

so = []
for x in si:
  so.append(repr(x)[1:-3]+'\n')

fo = file(outputFileName,'w')
fo.writelines(so)
fo.close()
# end j2a.py


 三文字の拡張子を持つファイルを、'filename.py'形式
にして打ち出します。
 たとえばこのように使います。

C:\> python j2a.py xxx.txt

 すると、コード変換された'xxx.py'が出来上がるとい
う寸法です。
 これは、2バイトコードと1バイトコードが混在する
スクリプトでは全て使えますので、結構便利じゃないか
と思います。
 もちろん、「P は〜」の連載で使おうと思って作った
んですけどね、ハイ(構想は前からありましたが)

 /機械伯爵/必要はプログラムの母/