たいした話ではないのだけれど、PHPには「指定したエンコードで保存する」という方法が見つからないので、UTF-16に変換してそのままファイル保存をするとBOM(バイトオーダーマーク)が付かないからエンディアンの判定ができない。
具体的には以下の方法だとBOM無しになる。
<?php $contents = file_get_contents('utf8.txt'); $encoded = mb_convert_encoding($contents, 'UTF-16LE', 'UTF-8'); file_put_contents('utf16le.txt', $encoded);
なので、リトルエンディアンのBOM付きで保存する場合は以下のようにやる。
<?php $contents = file_get_contents('utf8.txt'); $encoded = chr(255) . chr(254). mb_convert_encoding($contents, 'UTF-16LE', 'UTF-8'); file_put_contents('utf16le.txt', $encoded);
ビッグエンディアンでBOM付きの場合は、同じ要領でBOMのキャラクタを変更する。
<?php $contents = file_get_contents('utf8.txt'); $encoded = chr(254) . chr(255). mb_convert_encoding($contents, 'UTF-16BE', 'UTF-8'); file_put_contents('utf16be.txt', $encoded);
Windows環境だと基本リトルエンディアンだと思うので、エディタで開いたときに化け化けになったりした場合は、BOMが付いているかを疑ってみると良いかもしれない。