Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Web программирование > HTML и CSS
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 13.03.2015, 15:44   #1
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию Apache и кодировка в именах файлов

Добрый день.

помогите, пожалуйста, разобраться с таким вопросом.

Есть сервер с Apache (под Ubuntu - это важно!).
на нём лежат файлы. Они нормально отдаются/скачиваются.

Поставил себе сервер локально под Windows 7.
Те же файлы скрипт видит. Но скачать их нельзя.

Проблема понятно в чём - в кодировке.
в настройках апача стоит кодировка по умолчанию UTF-8
(в .htaccess AddDefaultCharset UTF-8)

в php такой код:
Код:
  <?php
   $curfilename = dirname( __FILE__ ) . '/Test Русское наименование файла.txt';
   
   if( file_exists($curfilename)) {
     echo "File $curfilename exist!!<br>"; 
   }
   else {
     echo "File $curfilename not exist!<br>"; 
   }
   echo '<a href="Test Русское наименование файла.txt">Скачать файл <Test Русское наименование файла.txt></a>';
  ?>
Но вопрос в общем простой - насколько такое поведение сервера корректно и какие рекомендации по решению проблемы могут предложить уважаемые магистры?
Или просто забить? Ибо рабочий сервак под Ubuntu работает как надо, а локальный нужен для отладки/разработки...

p.s. для того, чтобы можно было посмотреть на проблему "живьём" прикрепляю маленький архив, в нём три файла:
.htaccess
test.php
Test Р*СѓСЃСЃРєРѕРµ наименование файла.txt

(последний файл - это "Test Русское наименование файла.txt" в кодировке UTF-8)

ещё раз хочу отметить. Эти же файлы, размещённые на сервере под Ubuntu отрабатывают без всяких вопросов, под Windows - не работают.

Заранее благодарен за ответы/помощь.
Вложения
Тип файла: rar test_filename_coding.rar (705 байт, 15 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.03.2015, 17:47   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,590
По умолчанию

Хм... Сергей, попробуйте изменить кодировку на локальном сервере на Windows-1251.

И ещё дам совет. У Вас написано
Код:
<Test Русское наименование файла.txt>
Я бы всё-таки угловые скобки (знаки сравнения больше и меньше) заменил HTML-мнемониками https://ru.wikipedia.org/wiki/%CC%ED...EA%E8_%E2_HTML
В частности: для < - &lt; и для > - &gt;
Имеется в виду в том php файле, где у Вас этот код написан

Последний раз редактировалось Вадим Мошев; 13.03.2015 в 17:49.
Вадим Мошев вне форума Ответить с цитированием
Старый 13.03.2015, 18:41   #3
Streletz
Старожил
 
Регистрация: 02.01.2014
Сообщений: 2,823
Вопрос

Переименовать файл Test Р*СѓСЃСЃРєРѕРµ наименованиефайла. txt
002.PNG
в Test Русское название файла.txt, как ни странно, работает.
Возможно, при сохранении файла по каким-то причинам в названии кодировка слетела.
Как вариант, ещё можно попробовать iconv.
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Проблема понятно в чём - в кодировке.
в настройках апача стоит кодировка по умолчанию UTF-8
(в .htaccess AddDefaultCharset UTF-8)
Оба файла Test.php и текстовый файл в UTF-8 изначально. Или там есть файлы в Windows-1251?

Последний раз редактировалось Streletz; 13.03.2015 в 18:43.
Streletz вне форума Ответить с цитированием
Старый 14.03.2015, 03:56   #4
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,384
По умолчанию

Тут дело скорей всего не в локальном серваке, он будет любую кодировку которая есть на винде.
Предположу что скачивал файлы наверно с помощью FileZilla - дело в том, что в нем надо принудительно задавать кодировку utf-8 и передачу фалов в двоичном формате и тогда все будет нормально.
uberchel вне форума Ответить с цитированием
Старый 14.03.2015, 09:45   #5
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

А сами файлы у тебя в какой кодировке? Чем ты их редактиш?
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 14.03.2015, 16:57   #6
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,676
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
в Test Русское название файла.txt, как ни странно, работает.
Таки да. Под Windows нужно сохранять файлы так, чтобы они нормально выглядели в самой Windows. За столько лет программы уже научились получать Юникод-имя файла из системы и преобразовывать его в UTF-8 самостоятельно. Apache в том числе, я полагаю. Работает ведь.

99% инструкций по установке и настройке в этих ваших интернетах -- бесполезное старье.
Vapaamies вне форума Ответить с цитированием
Старый 17.03.2015, 11:17   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

Молчал в теме, потому как пытался осмыслить, сказанное и разобраться с проблемой.

Но, видимо, мне это не судьба понять всю эту шнягу!


Цитата:
Сообщение от Вадим Мошев
И ещё дам совет. У Вас написано
Код:
<Test Русское наименование файла.txt>
да, спасибо за совет. это у меня глупость написана. Разумеется, так нельзя писать.
Но это к сути проблемы отношения не имеет.
можно и так написать:
Код:
   echo '<a href="Test Русское наименование файла.txt">Скачать файл с русским наименованием</a>';
Цитата:
Сообщение от Вадим Мошев
Хм... Сергей, попробуйте изменить кодировку на локальном сервере на Windows-1251.
это, к сожалению, тоже не айс.. (если не пропало желание помочь разобраться, расскажу подробнее почему не устраивает и не работает так, как надо).

Цитата:
Сообщение от Streletz
Переименовать файл Test Р*СѓСЃСЃРєРѕРµ наименованиефайла. txt в Test Русское название файла.txt, как ни странно, работает.
угу. но это тоже не выход!! Во-первых, тогда перестаёт работать функция file_exists()
выдаётся - File .... not exist!
Т.е. для локального сервера он НЕ ВИДЕН (это выяснил почему - потому что скрипт PHP в формате UTF-8. если скрипт переделать в кодировку 1251 - то file_exists - работает!).
во-вторых, файл с подобным именем загружается скриптом (пример скрипта во вложении upload.php).

Цитата:
Сообщение от Naive
А сами файлы у тебя в какой кодировке? Чем ты их редактишь?
какие именно файлы? Если речь идёт про скрипты на PHP - то все файлы в кодировке UTF-8 (редактирую их в Far Commander)
если речь про загружаемые файлы - то это вообще бинарные файлы (doc, docx, pdf и т.д. тут в примере txt я выбрал исключительно для наглядности. Хотите, вместо него jpg возьму?).

Вообще не знаю, куда копать и что делать!


p.s. господа-товарищи программисты. Спасибо большое за то, что не бросаете меня в этом омуте. Я тут уже давно себе все мозги заплёл, туплю конкретнейше!!!
А пока склоняюсь к тому, что невозможно один и тот же код иметь и для Windows и для Unix/Linux, более того, по простому передать сайт так, чтобы он у меня работал локально под Windows - не получается. А по сложному - смысла нет. Ибо целевое назначение - это всё таки unix-подобная платформа.

p.p.s. если кодировку файла upload.php поменять на 1251, то файл начинает загружаться на сервер в "нормальном" виде!
Вложения
Тип файла: rar upload.rar (559 байт, 10 просмотров)

Последний раз редактировалось Serge_Bliznykov; 17.03.2015 в 11:39.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.03.2015, 14:37   #8
Streletz
Старожил
 
Регистрация: 02.01.2014
Сообщений: 2,823
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Во-первых, тогда перестаёт работать функция file_exists()
выдаётся - File .... not exist!
Т.е. для локального сервера он НЕ ВИДЕН (это выяснил почему - потому что скрипт PHP в формате UTF-8. если скрипт переделать в кодировку 1251 - то file_exists - работает!).
Кодировку всего скрипта менять не имеет смысла. Проблема легко решается через iconv.
PHP код:
if( file_exists(iconv('utf-8','windows-1251',$curfilename))) {
     echo 
"File $curfilename exist!!<br>"
   }
   else {
     echo 
"File $curfilename not exist!<br>"
   } 
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
если кодировку файла upload.php поменять на 1251, то файл начинает загружаться на сервер в "нормальном" виде!
Возможно,в контексте вышесказанного есть смысл взглянуть в торону iconv.
Streletz вне форума Ответить с цитированием
Старый 17.03.2015, 16:56   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

Streletz, спасибо за идею/совет, попробую конвертить...


Добавлено через 9 минут
докладываю. да, работает.
если upload'ить файл из скрипта в кодировке UTF-9, то чтобы файл был в "родной" кодировке, можно так:
Код:
if ($_FILES)
{
...
$name = $_FILES['filename']['name'];
...
$nameconv = iconv('utf-8','windows-1251', $name );
move_uploaded_file($_FILES['filename']['tmp_name'], $nameconv);
...
}
спасибо!

Последний раз редактировалось Serge_Bliznykov; 17.03.2015 в 17:08.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как выбрать файлы по дате в именах и заархивировать их? GorSHOK1 Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 4 21.10.2015 22:04
кодировка на apache acteralex PHP 0 10.07.2012 21:45
сбой в именах файлов Tadjik Операционные системы общие вопросы 1 27.09.2010 10:13
Что означает буква A в именах параметров? mutabor Общие вопросы Delphi 12 28.03.2010 10:12
IdFTP and CharSet (кодировка имен файлов) X11 Работа с сетью в Delphi 2 26.01.2010 12:21


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя