我得到的图像文件在文件名中包含捷克语字符(例如,ěščřžýáíé),我想重命名它们而不带重音,以便它们更适合网络。
我以为我可以使用一个简单的 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 上运行,但跨平台工作的答案甚至更好:)

最佳答案

根据 0xFFFD 标记(在 Firefox 中显示为带有问号的菱形),您已经没有使用正确的编码(即 Unicode/UTF-8)读取它们。据我发现这个 bug ,它似乎是相关的。

这是关于此的另一个 SO 主题:php readdir problem with japanese language file name

说到点子上,等PHP6稳定了再用。

与问题无关: Normalizer 是摆脱 diacritical marks 的更好工具。

关于带有欧洲字符的 PHP readdir,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1766863/

10-15 18:36