くだらないコメント拒否
この記事はPOSIX原理主義に基づいて書いている。POSIXを逸脱した途端、「どこでも動く」「コンパイル不要で動く」「10年、20年先もたぶん動く」という時空を超えた互換性を捨てることになる。 だからPOSIX原理主義な記事を書いているというのに、その意図を汲まずにするくだらないコメント、とくに**heliac2000という著作権侵害も平気で犯す輩は絶対にコメントしないこと。**
人によってひらがなだったりカタカナだったり
名簿入力フォームで名前とふりがなが集まったのだが、ふりがなが人によってひらがなだったりカタカナだったりするので統一したい。
という相談を受けた。
尚、ひらがなは全角文字にしか存在しない(MSXなど半角ひらがなを持っているコンピューターはあるのだけど一般的ではない)ため、全角文字前提での話とする。半角カタカナを扱いたい場合は、全角文字・半角文字の相互変換によって全角に直してから参照すること。
さて、どうすればいいか。
正攻法で変換する
これも全角文字・半角文字の相互変換と同様に、正攻法でやるとよい。つまり、
テキストデータを1バイトずつ読み、各文字が何バイト使っているのかを認識しながら読み進めていく。
その際、対になるひらがなあるいはカタカナに変換可能な文字に遭遇した場合は置換する。
それにはAWKを使うとよいだろう。
ひらがな→カタカナ変換コマンドhira2kata
例によってPOSIXの範囲で実装し、コマンド化したものがGitHubに公開されている。hira2kataという名のコマンドだ。Open usp Tukubaiというシェルスクリプト開発者向けコマンドセットにあるhan、zenコマンドのインターフェースに似せる形で作ったものである。
例えば、次のようなテキストファイルがあったとする。
# No. フリガナ
い もがみ
ろ カガ
は ふぶき
に ムツ
ほ ぜかまし
問題文にもあったように、回答者によってふりがなをひらがなで入力したりカタカナで入力したりまちまちになっている。回答者名で検索したいとなった時、検索する側はいちいちひらがなかカタカナかを区別したくない。このよう時に、次のようにしてhira2kataを使うのである。
$ ./hira2kata 2 furigana.txt
# No. フリガナ
い モガミ
ろ カガ
は フブキ
に ムツ
ほ ゼカマシ
$
こうしておけば、全角カタカナで簡単に回答者名のgrep検索が可能になるだし、50音順ソートもできるようになる。注意すべきは、この例ではhira2kataコマンドの第1引数に“2”と書いてあるところである。のは、第2フィールドだけ変換せよという意味である。よって第1フィールドの数字はそのままになっている。仮に“2”という引数無しにファイル名だけ指定すると、フィールドという概念無しに、テキスト中にある全てのひらがなを変換しようとする。よって、その場合第1フィールドの「いろは……」もカタカナになる。
尚、このhira2kataコマンドはUTF-8のテキストにしか対応しておらず、JISやShitf JIS、EUC-JPテキストには対応していない。そのような文字を扱いたい場合は、iconvコマンドを用いたり、nkfコマンド(POSIXではないが)を用いて予めUTF-8に変換しておくこと。
それから、このサンプルデータで「ほ」行の島風さんだけ右から書いてあるが、昭和じゃないんだから左から書くようにと言っておいってもらいたい。
カタカナ→ひらがな変換コマンドkata2hira
上の例ではカタカナに統一したが、逆にひらがなに統一してもよい。その場合はkata2hiraという名のコマンドを使う。
もう少し詳しい解説
全角文字を半角文字に変換するコマンドが作れたのだから、半角文字に変換する代わりにひらがな・カタカナの変換をするのも大したことはない。
マルチバイト文字なので、半角・全角変換と同様に、1バイトずつ読んだ場合、それがマルチバイト文字の終端なのか、それとも途中なのかということを常に判断しなければならないのだが、その後の置換作業で一工夫してある。
半角全角変換の際は完全に連想配列に依存していたが、ひらがな・カタカナ変換においては、高速にするために使用を控えている。その代わりにキャラクターコードを数百番ずつシフトするような計算を行っている。UTF-8においては、ひらがなとカタカナはユニコード番号が数十バイト離れたところにそれぞれマッピングされているので、それを見ながらユニコード番号を数百番ずらして目的の文字を作っているというわけだ。