Lightweight Language Lovers
Python vs Ruby
システム部門で働いていると、テキストデータの受渡しが多いことでしょう。
最近はWEBが使ったシステムが多く、データの連携において機種依存文字や外字が含まれていないか
チェックが必要なケースが増えてきました。
以下はPython で書いていたチェックプログラムです。
必要に迫られて作ったので、文字の範囲を1バイト目だけで判断するなど、かなりのやっつけのプログラムです。
1 # -*- coding: cp932 -*-
2 """ Handle SJIS charcters"""
3 class SjisChars:
4
5 def __init__(self, s):
6 self.s = s
7
8 def check(self, d):
9 self.isKanji = ((0x81 <= d <= 0x9F) or (0xE0 <= d <= 0xFC))
10 self.isKisyu = (d in (0x87, 0xED, 0xEE, 0xFA, 0xFB, 0xFC))
11 self.isGaiji = (0xF0 <= d <= 0xF9)
12
13 def scan(self):
14 a = [c for c in self.s]
15 while len(a) > 0:
16 c = a.pop(0)
17 self.check(ord(c))
18 if self.isKanji:
19 c += a.pop(0)
20 yield c
21
22 if __name__ == '__main__':
23 sc = SjisChars("abcd漢字外字機種依存")
24 for c in sc.scan():
25 print c, sc.isKanji, sc.isKisyu, sc.isGaiji
シフトJIS文字列を操作するクラスで、check は漢字か否か等を判定してメソッド、scan は、2バイト文字(漢字)を考慮して1"文字"づつ返すメソッドです。ここで、
「ジェネレータは、イテレータを作成するための簡潔で強力なツールです。」http://www.python.jp/doc/release/tut/node11.html#SECTION0011900000000000000000 を使いました。Pythonだと理屈が分からなくとも 簡単に高級な機能を使うことができます。