#acl SomeUser:read,write All: read = Lightweight Language Lovers = == Python vs Ruby == システム部門で働いていると、テキストデータの受渡しが多いことでしょう。[[BR]] 最近はWEBが使ったシステムが多く、データの連携において機種依存文字や外字が含まれていないか[[BR]] チェックが必要なケースが増えてきました。 以下はPython で書いていたチェックプログラムです。[[BR]] シフトJIS(MS932)の文字列の中に、Windows固有の文字や外字が含まれないか調べのが目的です。 {{{#!python # -*- coding: cp932 -*- """ Handle SJIS charcters""" class SjisChars: def __init__(self, s): self.s = s def check(self, d): self.isKanji = ((0x81 <= d <= 0x9F) or (0xE0 <= d <= 0xFC)) self.isKisyu = (d in (0x87, 0xED, 0xEE, 0xFA, 0xFB, 0xFC)) self.isGaiji = (0xF0 <= d <= 0xF9) def scan(self): a = [c for c in self.s] while len(a) > 0: c = a.pop(0) self.check(ord(c)) if self.isKanji: c += a.pop(0) yield c if __name__ == '__main__': sc = SjisChars("abcd漢字外字機種依存") for c in sc.scan(): print c, sc.isKanji, sc.isKisyu, sc.isGaiji }}} check は漢字か否か等を判定するメソッド、scan は、2バイト文字(漢字)を考慮して1"文字"づつ返すメソッドです。[[BR]] メインの部分の説明ですが、まず14行目で文字列を1バイトで区切って配列に格納してから、1つ取り出してみて(pop)、漢字であれば次のバイトも取り出して += して返すことを繰り返します。(文字の範囲は手抜きして1バイト目だけで判断しています。)[[BR]] さて、ここで[http://www.python.jp/doc/release/tut/node11.html#SECTION0011900000000000000000 「ジェネレータは、イテレータを作成するための簡潔で強力なツールです。」] を使っています。Pythonだと理屈がいま一つ良く呑み込めなくても :D 簡単に高級な機能を使うことができてしまいます。 次はこれをRubyで実装してみたいと思います。 ---- CategoryRuby