Lightweight Language Lovers

Python vs Ruby

システム部門で働いていると、テキストデータの受渡しが多いことでしょう。
最近はWEBが使ったシステムが多く、データの連携において機種依存文字や外字が含まれていないか
チェックが必要なケースが増えてきました。

以下はPython で書いていたチェックプログラムです。
シフトJIS(MS932)の文字列の中に、Windows固有の文字や外字が含まれないか調べのが目的です。

   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"文字"づつ返すメソッドです。
文字の範囲を1バイト目だけで判断してしまっていますが、これは少し手抜きですね。 :) さて、 「ジェネレータは、イテレータを作成するための簡潔で強力なツールです。」 を使いました。Pythonだと理屈が良く呑み込めなくても :) 簡単に高級な機能を使うことができてしまいます。


CategoryRuby