home > 投稿 > php:ファイル名の日本語エンコード、虎の巻。
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" とすれば問題ない。

トラックバックURL

http://faces2.bascule.co.jp/mt/mt-tb.cgi/554

コメントを投稿

(コメントには承認が必要になることがあります。承認されるまではコメントは表示されません。)