検証

半角性数字、中国語(繁体字)、日本語、ヘブライ語、ベンガル語、ハングルのファイル名で検証する。

<?php 
$list = scandir2('sample');
echo '<pre>';
var_dump($list);
echo '</pre>';

function scandir2($dp){
	$files = scandir($dp);
	
	$enclist = array(
	'UTF-8','SJIS','ASCII' ,
	);	
	
	$code_str = join(',', $enclist);

	echo "<table class='tbl2'><tbody>";

	foreach($files as $file){
		if($file=='.' || $file=='..'){
			continue;
		}

		echo '<tr>';
		echo '<td>' . urlencode($file) . '</td>';
	
		$enc = mb_detect_encoding($file,$code_str);
		$file= mb_convert_encoding($file,"UTF-8",$enc);
		$enc2 = mb_detect_encoding($file);

		echo '<td>' . $enc . '</td>';
		echo '<td>' . $enc2 . '</td>';
		echo '<td>' . $file . '</td>';

		$files2[] = $file;
		
		echo '</tr>';
	}
	echo '</tbody></table>';
	return $files2;
}
?>

出力

cat.txtUTF-8ASCIIcat.txt
%D7%97%D7%AA%D7%95%D7%9C.txtUTF-8UTF-8חתול.txt
%E0%A6%95.txtUTF-8UTF-8ক.txt
%E4%B8%80%E9%9A%BB%E8%B2%93.txtUTF-8UTF-8一隻貓.txt
%E7%8C%AB.txtUTF-8UTF-8猫.txt
%EA%B3%A0%EC%96%91%EC%9D%B4.txtUTF-8UTF-8고양이.txt
array(6) {
  [0]=>
  string(7) "cat.txt"
  [1]=>
  string(12) "חתול.txt"
  [2]=>
  string(7) "ক.txt"
  [3]=>
  string(13) "一隻貓.txt"
  [4]=>
  string(7) "猫.txt"
  [5]=>
  string(13) "고양이.txt"
}

scandirEx関数


<?php 
$list = scandirEx('sample');
echo '<pre>';
var_dump($list);
echo '</pre>';

/**
 * ディレクトリ内のファイル一覧を取得(外国語ファイル名に対応)
 * 
 * @note
 * さくらサーバー(スタンダードプラン)である場合、ファイル名が外国語でも取得可能。半角英数字はASCII、他言語はUTF-8として取得される。
 * 一般的なローカル環境(Windows)である場合、半角英数字はASCII、日本語はUTF-8、多言語は文字化けする。
 * 
 * 外国語のファイル名を取得したい場合、サーバーのOSレベルでの設定が必要になってくる。
 * 
 * @param unknown $dp
 * @param string $str_code
 * @return string
 */
function scandirEx($dp,$str_code='UTF-8,SJIS,ASCII'){
	$files = scandir($dp);
	
	foreach($files as $file){
		if($file=='.' || $file=='..'){
			continue;
		}
		
		$enc = mb_detect_encoding($file,$str_code);
		$file= mb_convert_encoding($file,"UTF-8",$enc);
		
		$files2[] = $file;
		
	}
	return $files2;
}
?>

出力

array(6) {
  [0]=>
  string(7) "cat.txt"
  [1]=>
  string(12) "חתול.txt"
  [2]=>
  string(7) "ক.txt"
  [3]=>
  string(13) "一隻貓.txt"
  [4]=>
  string(7) "猫.txt"
  [5]=>
  string(13) "고양이.txt"
}