揮発性のメモ2

http://d.hatena.ne.jp/iww/

UTF16をUTF8に変換する

#        'メニュー' と書いてある
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 が優先されるっぽい(?)けど、そんなのは信用できないのでエンディアンはちゃんと書く

STDINfopen('php://stdin','r') の戻り値と同義