我得到具有捷克字符的文件名(例如,ěščřžýáíé)图像文件,我想他们没有口音重命名,使他们的网络更兼容。 我以为我可以用一个简单的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)读取它们。据我发现这个错误,它似乎是相关的。

下面是另一个话题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。

在这种情况下,这样做:

$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]);
}

mb_convert_encoding()所需要的EXT / mbstring扩展和iconv()需要EXT /的iconv。

不直接回答你的问题,也许,但你可能想看看的 iconv() 功能在PHP和更多的particulare,你可以追加到第二个参数//TRANSLIT选项。 我已经使用了好几次转向法国和东欧的字符串到他们的A-Z和url友好的同行。

从PHP.net( http://www.php.net/手动/ EN / function.iconv.php

  

如果您追加字符串// TRANSLIT到out_charset音译被激活。这意味着,当一个字符不能在目标字符集来表示,它可以通过一个或几个类似地寻找字符近似。

您的源代码(和测试字符串)似乎是在UTF8,而文件名似乎使用一个单字节编码。我建议你使用相同的编码为您的替换字符串。为了避免源编码问题,它最好写在代码在十六进制形式重音字符(如\ xE8为“C”等)。

所以我得到它的工作我的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;
}
?>

基本上,它不是这样的欧洲字符转换成ASCII equivilent问题,但我能找到没有可靠的方法来重命名的文件(即,参考文件与非ASCII字符)。

有关UTF-8的使用PHP函数函数utf8_encode。微软Windows使用ISO-8859-1所以在这种情况下的转换是必要的。

实施例 - 列出在目录中的文件:

<?php
$dir_handle = opendir(".");
while (false !== ($file = readdir($dir_handle)))
{
  echo utf8_encode($file)."<br>";
}
?>

Area5one具有它的权利 - 它是不同的编码的问题

当我升级我的机器从XP到Win7的,我也升级我的版本MySQL和PHP的。沿途某处,即用于工作PHP程序停止工作。特别是,SCANDIR,READDIR和UTF-8已经幸福地生活在一起,但不再。

所以,我修改我的代码。有关从硬盘结束“_ISO”采取reflecct Windows的ISO-8859-1编码数据变量,从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,丹麦字符)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top