macの濁点・半濁点が分離したをファイル名一覧を融合

さて、引き続き検索するプログラムなんですが、そもそもMacには標準で拡張版iconvがインストールされていて濁点・半濁点が分離した文字を融合できる。
試しにファイル一覧(hoge.txt)を作って、iconv(fuge.txt)で変換してみた。
$ find . >hoge.txt
$ iconv -f UTF-8-MAC -t UTF-8 hoge.txt -o fuge.txt
結果は途中で止まってしまう。どうやら文字数制限があるようだ。

RubyJavaでは簡単にできるようだがMacにRubyを入れてないし、RubyもJavaも苦手だ。

NFDの濁点・半濁点を分離して1文字とする方式はUTF-8-MACと表記されたりする事もあるが文字コードでは無いので単純にPHPのmb_convert_encordingでは変換出来ない。
そこで自前で変換する関数を作った。(思いつく限りの文字を入れてますが足りない文字があるかもしれません)

function macDakuten($str){
	$daku = "\xE3\x82\x99";//http://www.fileformat.info/info/unicode/char/3099/index.htm
	if (strpos($str,$daku) !== false) {
		$hiras = array("か" => "が","き" => "ぎ","く" => "ぐ","け" => "げ","こ" => "ご","さ" => "ざ","し" => "じ","す" => "ず","せ" => "ぜ","そ" => "ぞ","た" => "だ","ち" => "ぢ","つ" => "づ","て" => "で","と" => "ど","は" => "ば","ひ" => "び","ふ" => "ぶ","へ" => "べ","ほ" => "ぼ","う" => "ヴ");
		$katas = array("カ" => "ガ","キ" => "ギ","ク" => "グ","ケ" => "ゲ","コ" => "ゴ","サ" => "ザ","シ" => "ジ","ス" => "ズ","セ" => "ゼ","ソ" => "ゾ","タ" => "ダ","チ" => "ヂ","ツ" => "ヅ","テ" => "デ","ト" => "ド","ハ" => "バ","ヒ" => "ビ","フ" => "ブ","ヘ" => "ベ","ホ" => "ボ","ウ" => "ヴ");
		foreach($hiras as $mykey => $myvalue) { $str = str_replace($mykey.$daku,$myvalue,$str); }
		foreach($katas as $mykey => $myvalue) { $str = str_replace($mykey.$daku,$myvalue,$str); }
	}
	$daku = "\xE3\x82\x9A";//http://www.fileformat.info/info/unicode/char/309a/index.htm
	if (strpos($str,$daku) !== false) {
		$hiras = array("は" => "ぱ","ひ" => "ぴ","ふ" => "ぷ","へ" => "ぺ","ほ" => "ぽ");
		$katas = array("ハ" => "パ","ヒ" => "ピ","フ" => "プ","ヘ" => "ペ","ホ" => "ポ");
		foreach($hiras as $mykey => $myvalue) { $str = str_replace($mykey.$daku,$myvalue,$str); }
		foreach($katas as $mykey => $myvalue) { $str = str_replace($mykey.$daku,$myvalue,$str); }
	}
	return $str;
}

普通に検索をするならUTF-8からUTF-8-MACに変換して検索するべきですが、
今回はmacが普段寝てる事から全ファイル一覧を抽出し、UTF-8-MAC→UTF-8の変換した上でDropbox内に保存する事にしました。

スマートでは無い気もしますが、濁点が検索出来ない問題が解決し、何時でも何処でも検索可能になりました。

Tags: , , ,

トラックバック

コメントを書く