Русские имена файлов при загрузке в галер&#10 Русские имена файлов при загрузке в галер&#10
 

News:

CPG Release 1.6.26
Correct PHP8.2 issues with user and language managers.
Additional fixes for PHP 8.2
Correct PHP8 error with SMF 2.0 bridge.
Correct IPTC supplimental category parsing.
Download and info HERE

Main Menu

Русские имена файлов при загрузке в галер

Started by Kowex, May 02, 2007, 11:51:12 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Kowex

Возможно это как то решить?
Ошибки при создании миниатюр..
ссылка вот такого типа получается ...../userpics/10025/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_268.jpg
А было Изображение_268.jpg

Alex Revo

#1
Странно... у меня такого не происходит...
Какая версия галереи?

Makc666

#2
Всего скорее это зависит от того, установлены ли:
php5-iconv или libiconv (не помню точно что важнее). 

и от настроек блока в файле php.ini:

[iconv]
;iconv.input_encoding = ISO-8859-1
;iconv.internal_encoding = ISO-8859-1
;iconv.output_encoding = ISO-8859-1

Но это лишь мои догадки :)

Kowex

версия 1.4.10


php.ini

;extension=php_iconv.dll

Kowex

Неужели никто не сталкивался с этим?
Как решить проблему, куда смотреть то хоть?

PHP 5
IIS 6

Alex Revo

#5
Давай проверим догадки Makca.
Посмотри значения в блока [iconv] в своем php.ini (www.your_gallery.ru/phpinfo.php)
Если там прописана какая-то кодировка, то ее можно переопределить через .htaccess, для этого нужно добавить в этот файл примерно такие строки
php_value iconv.input_encoding = windows-1251
php_value iconv.internal_encoding = windows-1251
php_value iconv.output_encoding = windows-1251

Это тоже моя догадка, Makc может объяснить лучше.

Makc666

#6
Кстати, я тут перечитал первое сообщение.
Ссылка получается такая у тебя:
...../userpics/10025/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_268.jpg

Изображение то отображается?

Просто по другому эта ссылка выглядить не может.
Русских букв там быть не может в ссылке.

Можно заменить русские буквы на подчеркивание при заливке файлов:

Конфиг -> Дополнительные настройки файлов и миниатюр
Символы, запрещенные в именах файлов

Изменить значение по умолчанию:
$/\\:*?"'<>|` &
на вот такое значение:
$/\\:*?"'<>|` &ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁйцукенгшщзхъфывапролджэячсмитьбюё

unxed


По-моему, весьма изящьное решение этой проблемы - взять файл include/functions.inc.php, и заменить в нем


function path2url($path)
{
        return str_replace("%2F","/",rawurlencode($path));
}


на


function path2url($path)
{
        return str_replace("%2F","/",rawurlencode(iconv("windows-1251","utf-8",$path)));
}


Естественно, это требует наличия php с поддержкой iconv. Впрочем, вместо iconv можно использовать любую функцию, перекодирующую из 1251 в utf-8. Разумеется, вместо windows-1251 можно вписать что угодно, если имена файлов в иной кодировке.

Проверено на Coppermine 1.4.12, Apache 2.2, PHP 5.1.6.

Andrey

после замены в файле include/functions.inc.php на
function path2url($path)
{
        return str_replace("%2F","/",rawurlencode(iconv("windows-1251","utf-8",$path)));
}

Стали отображаться фотки ранее загруженные с русским названием файла, и также успешно загружаются фотки с русским названием,
НО теперь файлы которые имеют русское название не возможно переименовать во что то другое, при такой попытке CPG говорит:
"Критическая ошибка
Исходный файл 'albums/userpics/10001/Р"олубые_С...олмы.jpg' отсутствует."
Но если заменить файл functions.inc.php на старый вариант с кодом:
function path2url($path)
{
        return str_replace("%2F","/",rawurlencode($path));
}

То переименовать удается успешно, но возвращается старая проблема с отображением файлов на русском :(
Кто знает где можно ещё подшаманить чуток? Чтобы и то и другое работало?

Makc666

Есть в файле:
editOnePic.php

вот такой кусок кода:
    // rename a file
    if ($_POST['filename'] != $pic['filename'])
    {
        if($CONFIG['thumb_use']=='ht' && $pic['pheight'] > $CONFIG['picture_width']) {
            $condition = true;
        } elseif ($CONFIG['thumb_use']=='wd' && $pic['pwidth'] > $CONFIG['picture_width']){
            $condition = true;
        } elseif ($CONFIG['thumb_use']=='any' && max($pic['pwidth'], $pic['pheight']) > $CONFIG['picture_width']){
            $condition = true;
        } else {
            $condition = false;
        }

        if ($CONFIG['make_intermediate'] && $condition ) {
            $prefices = array('fullsize', 'normal', 'thumb');
        } else {
            $prefices = array('fullsize', 'thumb');
        }

        if (!is_image($pic['filename'])){
            $prefices = array('fullsize');
        }

        foreach ($prefices as $prefix)
        {
            $oldname = urldecode(get_pic_url($pic, $prefix));
            $filename = replace_forbidden($_POST['filename']);
            $newname = str_replace($pic['filename'], $filename, $oldname);

            $old_mime = cpg_get_type($oldname);
            $new_mime = cpg_get_type($newname);

            if (($old_mime['mime'] != $new_mime['mime']) && isset($new_mime['mime']))
                cpg_die(CRITICAL_ERROR, sprintf($lang_editpics_php['mime_conv'], $old_mime['mime'], $new_mime['mime']), __FILE__, __LINE__);

            if (!is_known_filetype($newname))
                cpg_die(CRITICAL_ERROR, $lang_editpics_php['forb_ext'], __FILE__, __LINE__);

            if (file_exists($newname))
                cpg_die(CRITICAL_ERROR, sprintf($lang_editpics_php['file_exists'], $newname), __FILE__, __LINE__);

            if (!file_exists($oldname))
                cpg_die(CRITICAL_ERROR, sprintf($lang_editpics_php['src_file_missing'], $oldname), __FILE__, __LINE__);

            if (rename($oldname, $newname))
            {
                cpg_db_query("UPDATE {$CONFIG['TABLE_PICTURES']} SET filename = '$filename' WHERE pid = '$pid' LIMIT 1");
            } else cpg_die(CRITICAL_ERROR, sprintf($lang_editpics_php['rename_failed'], $oldname, $newname), __FILE__, __LINE__);
        }
    }


Может быть игра вот с этими переменными:
            $oldname = urldecode(get_pic_url($pic, $prefix));
            $filename = replace_forbidden($_POST['filename']);
            $newname = str_replace($pic['filename'], $filename, $oldname);

на примере:
function path2url($path)
{
        return str_replace("%2F","/",rawurlencode(iconv("windows-1251","utf-8",$path)));
}

вам и поможет.

P.S. У меня на сайте все работает с руссими буквами на ура без всяких изменений где-либо...

Andrey

да у меня тоже всё было нормально пока не обновился с 1.4.9 до 1.4.13 :(
спасибо посмотрю может что получится..

BrB

Один из вариантов решения:

Открываем:
include/functions.inc.php

Находим строку:
$str = str_replace(array('&amp;', '&quot;', '&lt;', '&gt;'), array('&', '"', '<', '>'), $str);;

Заменяем на:
$str = str_replace(array('&amp;', '&quot;', '&lt;', '&gt;', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ъ', 'ы', 'э', 'ю', 'я', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ъ', 'Ы', 'Э', 'Ю', 'Я'), array('&', '"', '<', '>', 'a', 'b', 'v', 'g', 'd', 'e', 'jo', 'zh', 'z', 'i', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'x', 'c', 'ch', 'sh', 'sch', 'j', 'j', 'y', 'e', 'y', 'ja', 'A', 'B', 'V', 'G', 'D', 'E', 'Jo', 'Zh', 'Z', 'I', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'X', 'C', 'Ch', 'Sh', 'Sch', 'J', 'J', 'Y', 'E', 'Y', 'Ja'), $str);;

Makc666

Quote from: BrB on April 14, 2008, 10:54:48 AM
Один из вариантов решения:
Хороший вариант, но, я думаю, что лучше было бы сделать вот так:

Открываем:
include/functions.inc.php

Находим строку:
$str = str_replace(array('&amp;', '&quot;', '&lt;', '&gt;'), array('&', '"', '<', '>'), $str);

Под ней вставляем строку: 
$str = str_replace(array('а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ъ', 'ы', 'э', 'ю', 'я', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ъ', 'Ы', 'Э', 'Ю', 'Я'), array('a', 'b', 'v', 'g', 'd', 'e', 'jo', 'zh', 'z', 'i', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'x', 'c', 'ch', 'sh', 'sch', 'j', 'j', 'y', 'e', 'y', 'ja', 'A', 'B', 'V', 'G', 'D', 'E', 'Jo', 'Zh', 'Z', 'I', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'X', 'C', 'Ch', 'Sh', 'Sch', 'J', 'J', 'Y', 'E', 'Y', 'Ja'), $str);

P.S.
Т.к. в строке:
$str = str_replace(array('&amp;', '&quot;', '&lt;', '&gt;'), array('&', '"', '<', '>'), $str);;
явная опечатка в коде с дублированием ;; в конце строки, то лучше искать данную строку с одной ;

BrB

Эту опечатку допустили сами разработчики  :(  (версия 1.4.16)

Makc666

Quote from: BrB on April 16, 2008, 11:18:52 AM
Эту опечатку допустили сами разработчики  :(  (версия 1.4.16)
Это точно :)
Я им об этом сразу написал, как увидел:
http://forum.coppermine-gallery.net/index.php/topic,51899.html

BrB

Makc666 думаю что ваш вариант лучше. У себя так и сделал.

BrB

Думаю, что еще лучше будет если сторока будет такая,

$str = str_replace(array('а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ъ', 'ы', 'э', 'ю', 'я', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ъ', 'Ы', 'Э', 'Ю', 'Я'), array('a', 'b', 'v', 'g', 'd', 'e', 'jo', 'zh', 'z', 'i', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'x', 'c', 'ch', 'sh', 'sch', 'j', 'j', 'y', 'e', 'y', 'ja', 'a', 'b', 'v', 'g', 'd', 'e', 'jo', 'zh', 'z', 'i', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'x', 'c', 'ch', 'sh', 'sch', 'j', 'j', 'y', 'e', 'y', 'ja'), $str);


т.к. приведем все к одному регистру

Makc666

Quote from: BrB on April 25, 2008, 11:03:22 AM
Думаю, что еще лучше будет если сторока будет такая,

$str = str_replace(array('а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ъ', 'ы', 'э', 'ю', 'я', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ъ', 'Ы', 'Э', 'Ю', 'Я'), array('a', 'b', 'v', 'g', 'd', 'e', 'jo', 'zh', 'z', 'i', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'x', 'c', 'ch', 'sh', 'sch', 'j', 'j', 'y', 'e', 'y', 'ja', 'a', 'b', 'v', 'g', 'd', 'e', 'jo', 'zh', 'z', 'i', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'x', 'c', 'ch', 'sh', 'sch', 'j', 'j', 'y', 'e', 'y', 'ja'), $str);


т.к. приведем все к одному регистру
Кстати да! Очень хорошое предложение!!!
Подобный вариант будет ещё лучше.
Т.к. UNIX системы чувствительны к регистру букв.
Единственное что, для удобства редактирования, подобные строчки лучше разбивать на две строки, к примеру...

Переименование только в маленькие буквы:
$str = str_replace(array('а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ъ', 'ы', 'э', 'ю', 'я'), array('a', 'b', 'v', 'g', 'd', 'e', 'jo', 'zh', 'z', 'i', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'x', 'c', 'ch', 'sh', 'sch', 'j', 'j', 'y', 'e', 'y', 'ja'), $str);
$str = str_replace(array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ъ', 'Ы', 'Э', 'Ю', 'Я'), array('a', 'b', 'v', 'g', 'd', 'e', 'jo', 'zh', 'z', 'i', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'x', 'c', 'ch', 'sh', 'sch', 'j', 'j', 'y', 'e', 'y', 'ja'), $str);


Переименование в маленькие и большие:
$str = str_replace(array('а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ъ', 'ы', 'э', 'ю', 'я'), array('a', 'b', 'v', 'g', 'd', 'e', 'jo', 'zh', 'z', 'i', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'x', 'c', 'ch', 'sh', 'sch', 'j', 'j', 'y', 'e', 'y', 'ja'), $str);
$str = str_replace(array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ъ', 'Ы', 'Э', 'Ю', 'Я'), array('A', 'B', 'V', 'G', 'D', 'E', 'Jo', 'Zh', 'Z', 'I', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'X', 'C', 'Ch', 'Sh', 'Sch', 'J', 'J', 'Y', 'E', 'Y', 'Ja'), $str);


Хотя это я уже придераюсь :)

Важное дополнение: При копировании из поста куска кода в файл, не забудьте при сохранении файла указать его кодировку, т.е. UTF-8 при использовании стандартной версии галереи.

D.Kalessky

у меня возникла проблемка, связанная и с этой темой, и с темой "bbcode превью с увеличением по клику для вставки фото на форумы" http://forum.coppermine-gallery.net/index.php/topic,51295.0.html.
К какой теме моя проблемка больше относится пока не знаю, но чтоб не постить в двух темах, напишу только тут.

Благодаря предыдущему сообщению от Makc666 я успешно решил проблему с русскими названиями файлов. Транслитерация работает замечательно. Однако в результатах работы плагина bbcode_1_21 возникает проблема отображения символа тильда ~, которая отображается как набор символов %7E.

Аналогично решению с русскими буквами попытался решить проблему и с тильдой, но не получилось. Порекомендуйте плиз вариант корректного ее отображения. Заранее спасибо.

D.Kalessky

и еще одно маленькое уточнение к написанному мной выше: параллельно с этой задачей порекомендуйте решение проблемы с некорректным отображением ссылок, если в их адресе находятся спецсимволы. так, на моем форуме запрещены символы % и ~, которые иногда встречаются. хотелось бы автоматом их заменить на процессе загрузки файлов.