سؤال

أحصل على ملفات الصور التي تحتوي على أحرف تشيكية في اسم الملف (على سبيل المثال ، ěččřááéé) وأريد إعادة تسميتها بدون لهجات بحيث تكون أكثر توافقًا مع الويب. اعتقدت أنه يمكنني استخدام وظيفة 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 لكن الإجابات التي تعمل عبر المنصات أفضل :)

هل كانت مفيدة؟

المحلول

خلل برمجي, ، يبدو أنه مرتبط.

إليك موضوع آخر حول ذلك: مشكلة 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 قبول المصفوفات فقط للبرامين الأولين ، وليس الأخير. قد أكون مخطئًا ، لكن على أي حال يجب أن ينجح هذا.

إذا كان لديك أي مشكلة ترميز حقيقية ، فقد يكون لديك فقط أن تستخدم نظام تشغيل بايت واحد بينما يستخدم ملف المصدر الخاص بك آخر ، وربما 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_CONVRET_ENCODING () تتطلب امتداد EXT/MBSTRING و ICONV () يتطلب EXT/ICONV.

لا توجد إجابة مباشرة على سؤالك ربما ولكن قد ترغب في إلقاء نظرة على iconv() وظيفة في PHP وأكثر في posiculare //TRANSLIT

من php.net (http://www.php.net/manual/en/function.iconv.php)

يبدو أن رمز المصدر (وسلسلة الاختبار) في UTF8 ، بينما يبدو أن أسماء الملفات تستخدم ترميزًا واحدًا بايت. أقترح عليك استخدام نفس الترميز لسلسلة الاستبدال الخاصة بك. لتجنب مشكلات ترميز المصدر ، من الأفضل كتابة chars معلمة في الكود الخاص بك في نموذج سداسي (مثل 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]);
  }
}

لا أعرف ما إذا كان ذلك بمثابة مصادفة أم لا ، ولكن الاتصال 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. يستخدم Microsoft Windows ISO-8859-1 لذلك في هذه الحالة يكون التحويل ضروريًا.

مثال - سرد الملفات في DIR:

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

عندما قمت بترقية جهازك من XP إلى Win7 ، قمت أيضًا بترقية نسختي من MySQL و PHP. في مكان ما على طول الطريق ، توقفت برامج PHP التي اعتادت العمل على العمل. على وجه الخصوص ، عاشت الفكاتين و Readdir و UTF-8 بسعادة ، ولكن لم تعد.

لذلك ، لقد قمت بتعديل الكود الخاص بي. المتغيرات المتعلقة بالبيانات المأخوذة من نهاية القرص الثابت في "_iso" إلى ترميز Windows 'ISO-8859-1 ، فإن البيانات من قاعدة بيانات MySQL تذهب في المتغيرات التي تنتهي في "_utf". وبالتالي ، فإن الرمز من Area5Oone ترغب في ذلك: $ dir_handle_iso = opendir (".") ؛ بينما (false! == ($ file_iso = readDir ($ dir_handle_iso))) {$ file_utf = utf8_encode ($ file) ؛ ...}

هذا يعمل بالنسبة لي 100 ٪:

setlocale(LC_ALL,"cs_CZ");
$new_str = iconv("UTF-8","ASCII//TRANSLIT",$orig_str);

$ file = mb_convert_encoding (ملف $ ، 'UTF-8' ، "ISO-8859-1") ؛ عملت بالنسبة لي (Windows ، الشخصيات الدنماركية).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top