機種依存文字を変換して置き換える

概要

・例えば「㈱」を「(株)」に置き換えるような処理。
・なんか昔やったことがあったけど、改めて書いておく。
Perlで言う「Unicode::Normalize」的なもの

使うもの

自分で頑張ってもいいし、新しいものを探してもいいんだけど昔からあるPEARのライブラリを使うことにする。こいつは特に依存関係もなく放り込んだら動くのが素晴らしい。欲を言えばPerlのようにデフォルトで付いていてくれるとありがたいのだけど。
seh. I18N_UnicodeNormalizer

難しい話はこちら(PHPにおけるUnicode文字列の正規化)に任せるとして、目的の処理はNFKCいう正規化を行えば可能になる。

その他にもPHP5以上でPECL intlがインストールされていれば、「Normalizer クラス」が使えるようになる。今回は使えなかったので前述のPEARで代用した。使い方なんかはPHP5.3のintl拡張モジュール - Normalizerによる正規化を参照すると良さそう。

サンプル

はじめに上記PEARをインストールする。適当にダウンロードして、適当に展開しておく。今回は、「lib」という名前のディレクトリに、tgzを展開してできたディレクトリの中身を放り込んだ。構造的にはこんな感じ。

├─I18N_UnicodeNormalizer-1.0.0.tgz  
├─index.php  
│  
└lib/  
    ├─UnicodeNormalizer.php  
    ├─data/  
    ├─docs/  
    ├─tests/  
    └─UnicodeNormalizer/

で、それを利用するプログラムのサンプルは以下。上のツリーではindex.phpに当たるよ。

ini_set('include_path',get_include_path() .PATH_SEPARATOR. "./lib");  
require_once("UnicodeNormalizer.php");

// テスト的にいくつかの機種依存文字を設定しておく  
$strs = array("㈱", "㍼", "Ⅰ", "℡", "㌻", "♣", "①②③④⑤⑥⑦");

// インスタンスの生成  
$normalizer = new I18N_UnicodeNormalizer();

foreach($strs as $str) {  
    // $strの文字列に対して正規化NFKCをかける。結果は正規化された文字列  
    $normalized = $normalizer->normalize($str, 'NFKC');

    // 表示して確認  
    print $str . " : " . $normalized . "\n";  
}

このプログラムを実行すると以下の様な結果が返ってくる。めでたしめでたし

㈱ : (株)
㍼ : 昭和
Ⅰ : I
℡ : TEL
㌻ : ページ
♣ : ♣
①②③④⑤⑥⑦ : 1234567