Lightweight Language Lovers

PythonとRubyを比較してみる(Pythonによるコーディング)

システム部門で働いていると、テキストデータの受渡しが多いことでしょう。
最近は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 a:
  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

check は漢字か否か等を判定するメソッド、scan は2バイト文字(漢字)を考慮して1バイトではなく1"文字"づつ返すメソッドです。

scan の説明ですが、まず14行目で文字列を1バイトで区切って配列に格納してから、1つ取り出してみて(pop)、漢字であれば次のバイトも取り出して += して返すことを繰り返します。(漢字の判定は手抜きして1バイト目だけで見ています。)

これをRubyで実装してみましょう。

と思いましたが

今あらためて見てみると、25行目は各文字は変数cに返ってきているのに、属性は親である文字列 sc を見にいっています。
とりあえず動くからいいのですが、あまり美しいとはいえません。
そこで、文字と文字列をきちんと分離してみることにしました。 --> /Python2


CategoryPython CategoryRuby

PythonVsRuby (last edited 2007-12-08 23:35:10 by ymd)