====== Романизация имён файлов ====== **Ключевые слова: UTF-8,romanize, cyrillic, latin, convert, filename** При обновлении с версий, которые ещё не имели функции «romanize», вы столкнетесь с полностью нечитаемой структурой директорий. Например: %D0%BA%D1%8B%D1%80%D0%B3%D1%8B%D0%B7%D1%81%D1%82%D0%B0%D0%BD.txt --- тоже самое, что и «кыргызстан.txt». Это произошло из-за того, что имена файлов в кодировке UTF-8 подвергаются преобразованию urlencode. В последних версиях была добавлена опция «романизации» для того, чтобы обойти эту проблему.((См. подробнее в «[[wiki:config:deaccent]]» и [[wiki:romanization]] )) Скрипт, приведённый ниже, конвертирует нечитаемое содержание директории в «романизированные» имена файлов. Вам необходимо включить файл [[wiki:tips:romanize:UTF8.php]], который входит в инсталляцию «ДокуВики». Замечание: этот скрипт не безупречен: например, есть определенные кириллические буквы, которые приведут к вставке символа "'" в имя файла. Все из-за того, что в UTF-8.php транслитерацией буквы 'ъ' является символ "'". Пожалуйста, проверьте свою структуру статей после преобразования некорректных имен файлов. Я надеюсь, что это будет полезно кому-то. Любые улучшения приветствуются. Update: UTF8.php был переписан, код, приводимый ниже, был протестирован с этой((переводчик: непонятно, какой)) версией [[wiki:tips:romanize:UTF8.php]] * @link http://aidanlister.com/repos/v/function.copyr.php * @param string $source Source path * @param string $dest Destination path * @return bool Returns TRUE on success, FALSE on failure */ function copyr($source, $dest) { $dest2=cleanID($dest); echo $source."->".$dest." ->$dest2
\n"; // Simple copy for a file if (is_file($source)) { return copy($source, $dest2); } // Make destination directory if (!is_dir($dest)) { mkdir($dest2); } // Loop through the folder $dir = dir($source); while (false !== $entry = $dir->read()) { // Skip pointers if ($entry == '.' || $entry == '..') { continue; } // Deep copy directories if ($dest !== "$source/$entry") { copyr("$source/$entry", "$dest/$entry"); } } // Clean up $dir->close(); return true; } copyr("/dokuwiki/data/pages/","/dokuwiki/data/pagesnew/"); function cleanID($id,$ascii=false){ $id = trim(urldecode($id)); $id = utf8_strtolower($id); $id = utf8_romanize($id); utf8_deaccent($id,-1); $id = preg_replace('#\'+#','_',$id); return($id); } ?>