2008/02/23
php:ファイル名の日本語エンコード、虎の巻。
仕事ではあまり使わない趣味の範囲のネタです。
Apache・ファイルシステム・php・flash にて日本語ファイル名のエンコードや内部エンコードがいっしょであることはまずないのですが、ボーっと日本語ファイル名をたたいても何も参照できなかったり。
Flash からサーバー上にある日本語名ファイルを参照しようとすれば、これは Apache の日本語エンコードに変換してから urlencode をかけてやる必要があります。逆に PHP のファイル関数を使う場合にはファイルシステムのエンコードに変換してから参照する必要があります。FLASH から PHP を使ってファイルシステムを参照し、それを取り出して直接 Apache ごしにファイルを参照するような場合には次々トランスレートしてやる必要があるわけです。
PHP 上で FLASH 用の変換をちまちま書くのですが、この関数が mb_convert_encoding 。長ったらしくてネストさせるとソースがぐちゃぐちゃで意味がわからないが、こういうのを用意するとスッキリする。
//サンプル
function fget($f) { return( file_get_contents(fencode($f)) ); }
function fput($f,$s) { return( file_put_contents(fencode($f),$s) ); }
function ftime($f) { return( filemtime(fencode($f)) ); }
function fsize($f) { return( filesize(fencode($f)) ); }
function fencode($s) { return( mb_conv($s,"php>file") ); }
function fdecode($s) { return( mb_conv($s,"file>php") ); }
function hencode($s) { return( mb_conv($s,"php>http") ); }
function hdecode($s) { return( mb_conv($s,"http>php") ); }
function sencode($s) { return( mb_conv($s,"php>swf") ); }
function sdecode($s) { return( mb_conv($s,"swf>php") ); }
function mb_conv($s,$from_to){
//$enc = $GLOBALS["ini"]["enc"];
$enc = array(
"file" => "SJIS-win", //Winの場合。サーバー上ならFTP転送エンコード、
//OSXの場合は Unicode ローカルフォーマット
"http" => "SJIS", //xampp なら UTF-8
"php" => "UTF-8",
"swf" => "UTF-8",
);
$trans = explode(">",strtolower($from_to));
for($i=0;$i<count($trans)-1;$i++){
$s = mb_convert_encoding( $s, $enc[$trans[$i+1]], $enc[$trans[$i]] ) );
}
return($s);
}
追記:
気のせいかもしれないが "file>http" とするとうまくいかないことがある?
"file>php>http" とすれば問題ない。