[PHP]環境依存文字のUTF-8への変換


結論

Windows環境で使われる文字コードは通常のShift-JIS(SJIS)ではなくWindows独自バージョンであり、PHPではSJIS-winと表記する。

Shift_JISではない

ITリテラシーの低い会社などでは、Windows内のフォルダ名やファイル名に特殊文字を使っていることが多々見受けられます。

example
, , , , , , , etc...

こういった文字をコマンド経由などで取り込んで文字コードをUTF-8にしたいときに、通常以下のようにすると思いますが、この例では特殊文字が文字化けしてしまい、しばらくはまりました。

function
mb_convert_encoding($str, 'utf8', 'SJIS');

Windowsでは文字コードSJISを使用していると思われがちですが、よく調べてみると、SJIS-win(cp932)というものらしいです。
ですので、以下のようにすると特殊文字の文字コード変換が可能です。

function
mb_convert_encoding($str, 'utf8', 'SJIS-win');

また、$from_encodingに'auto'を指定するとPHPはSJISと解釈するようなので、文字コード変換に失敗します。

実は...

簡単に言うとShift-JISは一般的な文字のみで、それにいくつか便利に使える拡張文字を追加したものがWindowsで使われているSJIS-win(cp932)という文字コードです。
しかし、便利と思われた拡張文字は他の文字コードではほとんど採用されず、結果特定の環境でしか使えない環境依存文字となってしまいました。
このような過去がありますが、UTF-8にはこうした特殊文字も用意されているため、変換できるというわけです。