ヨーロッパ文字を含む PHP readdir
-
21-09-2019 - |
質問
ファイル名にチェコ語の文字が含まれる画像ファイル (例: ěščřžýáíé) を取得し、Web との互換性を高めるためにアクセントを付けずに名前を変更したいと考えています。単純な str_replace 関数を使用できると考えましたが、ファイル配列では文字列リテラルと同じように機能しないようです。
拡張子を確認した後、readdirでファイルを読み取りました。
function readFiles($dir, $ext = false) {
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if($ext){
if(end(explode('.', $file)) == $ext) {
$f[] = $file;
}
} else {
$f[] = $file;
}
}
closedir($dh);
return $f;
} else {
return false;
}
} else {
return false;
}
}
$files = readFiles(".", "jpg");
$search = array('š','á','ž','í','ě','é','ř','ň','ý','č',' ');
$replace = array('s','a','z','i','e','e','r','n','y','c','-');
$string = "čšěáýísdjksnalci sášěééalskcnkkjy+ěéší";
$safe_string = str_replace($search, $replace, $string);
echo '<pre>';
foreach($files as $fl) {
$safe_files[] = str_replace($search, $replace, $fl);
}
var_dump($files);
var_dump($safe_files);
var_dump($string);
var_dump($safe_string);
echo '</pre>';
出力
array(6) {
[0]=>
string(21) "Hl�vka s listem01.jpg"
[1]=>
string(23) "Hl�vky v atelieru02.jpg"
[2]=>
string(17) "Jarn� v�hon03.jpg"
[3]=>
string(17) "Mlad� chmel04.jpg"
[4]=>
string(23) "Stavba chmelnice 05.jpg"
[5]=>
string(21) "Zimni chmelnice06.jpg"
}
array(6) {
[0]=>
string(21) "Hl�vka-s-listem01.jpg"
[1]=>
string(23) "Hl�vky-v-atelieru02.jpg"
[2]=>
string(17) "Jarn�-v�hon03.jpg"
[3]=>
string(17) "Mlad�-chmel04.jpg"
[4]=>
string(23) "Stavba-chmelnice-05.jpg"
[5]=>
string(21) "Zimni-chmelnice06.jpg"
}
string(53) "čšěáýísdjksnalci sášěééalskcnkkjy+ěéší"
string(38) "cseayisdjksnalci-saseeealskcnkkjy+eesi"
現在、私は WAMP で実行していますが、プラットフォーム間で動作する答えはさらに優れています:)
解決
(疑問符の内側とダイヤモンドのようにFirefoxで表示されます)0xFFFDマークによると、あなたはすでに(ユニコード/ UTF-8になります)正しいエンコーディングを使用してそれらを読んでいません。これまで私は、このバグを見られるように、関係しているようです。
ここではそのことについて、別のSOトピックがあります:日本語と PHPのreaddir問題ファイル名の
のポイントに、待機彼らはPHP6の安定を取得し、それを使用するまで。
問題に関係のない他のヒント
それは配列で文字列を使用していますが、そうでない場合、文字列だけでそれを適用する: - )
$search = array('š','á','ž','í','ě','é','ř','ň','ý','č',' ');
$replace = array('s','a','z','i','e','e','r','n','y','c','-');
len = count($safe_files)
for ($i=0; $i<len; $i++)
$safe_files[$i] = str_replace($search, $replace, $safe_files[$i]);
私は str_replace にのみ2つの最初のparamsのための配列を受け入れると思いますなく、最後に。私は間違っているかもしれないが、とにかくこの作業をする必要があります。
すべての平均によって、あなたは本当のエンコードの問題がある場合は、それだけで、おそらくUTF-8、別のソースファイルを使用しているときは、シングルバイトエンコーディングを使用し、OSいる可能性があります。
その場合は、のような何かをします:
$search = array('š','á','ž','í','ě','é','ř','ň','ý','č',' ');
$replace = array('s','a','z','i','e','e','r','n','y','c','-');
$code_encoding = "UTF-8"; // this is my guess, but put whatever is yours
$os_encoding = "CP-1250"; // this is my guess, but put whatever is yours
len = count($safe_files)
for ($i=0; $i<len; $i++)
{
$safe_files[$i] = iconv($os_encoding , $code_encoding, $safe_files[$i]); // convert before replace
/*
ALternatively :
$safe_files[$i] = mb_convert_encoding($safe_files[$i], $code_encoding , $os_encoding );
*/
$safe_files[$i] = str_replace($search, $replace, $safe_files[$i]);
}
()EXT / mbstring拡張モジュールとiconvを(必要)EXT / iconvの
必要mb_convert_encodingあなたの質問に対する直接の答えではないかもしれませんが、以下を参照してください。 iconv()
PHP の関数、特に //TRANSLIT
2 番目の引数に追加できるオプション。私はこれを何度か使用して、フランスと東ヨーロッパの文字列を a-z と URL に優しい文字列に変換しました。
PHP.net より (http://www.php.net/manual/en/function.iconv.php)
文字列 //TRANSLIT を out_charset に追加すると、音訳が有効になります。これは、文字がターゲットの文字セットで表現できない場合、1 つまたは複数の似た文字を使用して近似できることを意味します。
あなたのソースコード(およびテスト文字列)は、ファイル名がシングルバイトエンコーディングを使用しているように見える一方で、UTF8にあるように見えます。私はあなたの置換文字列に同じエンコーディングを使用することをお勧めしたいです。避けソースエンコードの問題のために、それは(「C」などのために\ xE8など)の六角形であなたのコード内のアクセント文字を書くために、より良いと思います。
だから私は、この
で私のWindows XPシステム上で作業それを得ました$search = array('š','á','ž','í','e','é','r','n','ý','c',' ');
$replace = array('s','a','z','i','e','e','r','n','y','c','-');
$files = readFiles(".", "jpg");
$len = count($files);
for($i = 0; $i < $len; $i++){
if(mb_check_encoding($files[$i], 'ASCII')){
$safe_files[$i] = $files[$i];
}else{
$safe_files[$i] = str_replace(
$search, $replace, iconv("iso-8859-1", "utf-8//TRANSLIT", $files[$i]));
}
if($files[$i] != $safe_files[$i]){
rename($files[$i], $safe_files[$i]);
}
}
それはconincidenceかない場合は、私は知らないが、
mb_get_info()
ショーを呼び出します
[internal_encoding] => ISO-8859-1
ここで私が参考に PHPのstrtrのページに別の関数です
<?
// Windows-1250 to ASCII
// This function replace all Windows-1250 accent characters with
// thier non-accent ekvivalents. Useful for Czech and Slovak languages.
function win2ascii($str) {
$str = StrTr($str,
"\xE1\xE8\xEF\xEC\xE9\xED\xF2",
"\x61\x63\x64\x65\x65\x69\x6E");
$str = StrTr($str,
"\xF3\xF8\x9A\x9D\xF9\xFA\xFD\x9E\xF4\xBC\xBE",
"\x6F\x72\x73\x74\x75\x75\x79\x7A\x6F\x4C\x6C");
$str = StrTr($str,
"\xC1\xC8\xCF\xCC\xC9\xCD\xC2\xD3\xD8",
"\x41\x43\x44\x45\x45\x49\x4E\x4F\x52");
$str = StrTr($str,
"\x8A\x8D\xDA\xDD\x8E\xD2\xD9\xEF\xCF",
"\x53\x54\x55\x59\x5A\x4E\x55\x64\x44");
return $str;
}
?>
基本的に、それはアスキーequivilentにヨーロッパの文字を変換するために、このような問題ではありませんでしたが、私は、ファイルの名前を変更する信頼できる方法(非ASCII文字を含むすなわち、参照ファイル)を見つけることができませんでした。
。 Microsoft Windowsの変換が必要である。この場合のようにISO-8859-1を使用します。
例 - ディレクトリ内のファイルを一覧ます:
<?php
$dir_handle = opendir(".");
while (false !== ($file = readdir($dir_handle)))
{
echo utf8_encode($file)."<br>";
}
?>
Area5oneは右のそれを持っている - 。それは異なるエンコーディングの問題です。
私はwin7のにXPから私のマシンをアップグレードした場合、私はまた、MySQLとPHPの私のバージョンをアップグレードしました。道に沿ってどこかには、作業に使用するPHPプログラムが動作を停止しました。特に、SCANDIR、READDIRとUTF-8が一緒に幸せに暮らしましたが、ないより長くしていました。
だから、私は自分のコードを修正しました。 WindowsのISO-8859-1エンコーディングをreflecctする「_ISO」でハードディスクの端から取られたデータに関連した変数、MySQLデータベースからのデータは、 『_utf』で終わる変数になります。したがって、area5oneからのコードは、これをたいと思います: $ dir_handle_iso =のopendir( ""); しばらく(偽!==($ file_iso =のreaddir($ dir_handle_iso))) { $ file_utf =はutf8_encode($ファイル); ... }
私のためにこの作品を100%:
setlocale(LC_ALL,"cs_CZ");
$new_str = iconv("UTF-8","ASCII//TRANSLIT",$orig_str);
$ファイル= mb_convert_encoding($ファイルを、 'UTF-8'、 "ISO-8859-1"); 私のために働いた(Windowsの、デンマーク語の文字)。