# 'メニュー' と書いてある MENUTEXT='\u30e1\u30cb\u30e5\u30fc'
のような、「ASCII+日本語だけエスケープしたUTF-16」みたいなテキストファイルをUTF-8に変換する。
#!/usr/bin/php -q <? $fp = STDIN; while( !feof($fp) ){ $line = trim( fgets($fp) ); $line = preg_replace_callback( '/\\\\u(....)/m', "utfcon", $line ); print $line."\n"; } // \u30e1 を メ に変換する function utfcon( $m ){ $s = pack("H4",$m[1]); $s = mb_convert_encoding( $s, "UTF-8", "UTF-16BE" ); return $s; } ?>
$ ./utfcon.php <a.txt >b.txt
\u30e1 は U+30e1(カタカナのメ)
正規表現で \u.... を捕まえて、パックしてUTF-8に変換する
phpの場合、BOMなしUTF-16 では UTF-16BE が優先されるっぽい(?)けど、そんなのは信用できないのでエンディアンはちゃんと書く
STDIN は fopen('php://stdin','r') の戻り値と同義