Назад | Перейти на главную страницу

Проблема с кодировкой имен файлов при переносе PHP-приложения с Windows Server 2003 на Linux

У меня есть несколько PHP-приложений, работающих на Windows 2003 Server. Поскольку они на самом деле используют PHP, Mysql и даже Apache в Windows, проект состоит в том, чтобы переместить их на новый сервер Linux (на основе Debian).

Но у меня возникла проблема с файлами, загруженными пользователями, когда для имен файлов используются «специальные символы» (файлы, отличные от ASCII, например éèàç) (что обычно во французском языке).

Например, файл "accusé réception.pdf" хранится как:

$ ls
accus? r?ception.pdf

Кажется, нет проблем, когда я загружаю новый файл на сервер Linux: файл будет иметь такое имя в fs, но приложение может его найти. Проблема в том, что контент перенесен, файл доступен, но приложение не может его найти!

Интересно, откуда может возникнуть проблема:

И, прежде всего, мне нужно найти способ исправить это. Поскольку это происходит только с перенесенными данными, я мог бы написать сценарий или настроить свой fs / php / something, чтобы решить эту проблему при запуске этих приложений в производство на сервере Linux.

Заранее спасибо за вашу помощь.

Примечание: когда приложение не может найти файл, мои журналы Apache заполняются ошибками «readdir () ожидает, что параметр 1 будет ресурсом, логическое значение задано в ...»

Я наконец нашел информацию о своей проблеме и способ ее решения. Компания, которая разрабатывает эти php-приложения, говорит мне использовать iso-8859-1 для обслуживания сохраненных файлов, настроив таким образом Apache. Это не решает мою проблему, но дает мне представление.

Я использовал convmv http://www.j3e.de/linux/convmv/man/ (благодаря Как определить языковую кодировку имени файла в Linux?) для преобразования имен файлов из utf-8 (я думаю, копия в debian делает их utf-8) в iso-8859-1 с

$ convmv -f utf-8 -t iso-8859-1 --no-test -r *

Это решает мою проблему, поскольку мои приложения теперь могут находить сохраненные файлы (перенесенные и новые).

Единственная проблема в том, что в моей оболочке я все еще неправильно вижу имена файлов:

$ ls 
test ��.xls

$ LANG=fr_FR.UTF-8 ls
test ??.xls

Но это «второстепенная» проблема.

ps: извините за исходный вопрос, который неправильно раскрыл проблему, и за то, что так поздно ответил на решение

Windows обычно использует Unicode для кодирования символов, отличных от ASCII, поэтому, если вы используете локаль unicode на своем сервере debian, вы настроены. Он не обязательно должен быть французским только потому, что символы, которые вы пытаетесь использовать, являются французскими (только что проверили это, у меня LANG установлен на en_US.UTF-8, и я могу создать файл с указанным вами именем ( "accusé réception.pdf"), и это тоже проявляется.

Скорее всего, акценты есть, их просто нельзя отобразить. Чтобы проверить эту теорию, замените команду «ls» на «LANG = en_US.UTF8 ls». Если он отображается правильно, это просто ваш терминал. Просто установите переменную LANG в файле запуска вашей оболочки (например, .bashrc) или для всей системы в / etc / default / locale.