概要
・例えば「㈱」を「(株)」に置き換えるような処理。
・なんか昔やったことがあったけど、改めて書いておく。
・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