PHPでUTF-16を保存するときにBOMをつける方法

たいした話ではないのだけれど、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が付いているかを疑ってみると良いかもしれない。

コメントする

メールアドレスが公開されることはありません。