Исправлено кодирование файла при загрузке файла из Linux в Windows в php - PullRequest
0 голосов
/ 24 июня 2009

Хорошо, у меня есть проблема. У меня есть веб-сервер Linux (RHEL 4 с apache 2), который используется для размещения приложения. Частью этого приложения является набор скриптов php. Я создал скрипт, который принимает некоторые переменные формы, а затем загружает файл пользователю. Вот си код:

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$destFileName);
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($fullPath));
ob_clean();
flush();
readfile($fullPath);

Это все отлично работает, и файл загружается. Но есть проблема. Эти файлы загружаются из коробки Linux на компьютер с Windows (ВСЕГДА). Проблема в кодировке. Когда вы смотрите на файл в окне Linux, весь текст выравнивается, и все столбцы выглядят хорошо. (Файлы являются просто текстовыми файлами). Но когда файл загружается в коробку Windows и открывается в блокноте, файл все засоряется, и ничего не выравнивается. Вы также видите странные символы (те, которые похожи на коробку, но это просто общее представление для неизвестного характера). Когда этот файл импортируется в другую программу, он не работает.

Однако, когда я открываю файл в WordPad, весь текст выглядит правильно. Если я сохраню его из WordPad, он будет импортирован правильно и будет выглядеть правильно в Notpad.

Я не очень разбираюсь в кодировке файлов, поэтому любая информация о том, как я могу кодировать файл перед отправкой пользователю для загрузки, была бы полезной.

Я попытался заменить readfile($fullPath); на:

$handle = @fopen($fullPath, "r");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle);
        $buffer = str_replace('\n', '\r\n', $buffer);
        echo $buffer;
    }
    fclose($handle);
}

Спасибо!

Ответы [ 3 ]

2 голосов
/ 25 июня 2009

Есть проблема со следующей строкой:

$buffer = str_replace('\n', '\r\n', $buffer);

Вам нужно использовать двойные кавычки. "\ n" это перевод строки. '\ n' - обратная косая черта буквальной последовательности символов:

# php -r "var_dump('\n', \"\n\");"
string(2) "\n"
string(1) "
"
1 голос
/ 24 июня 2009

Существует утилита Unix 'unix2dos' и 'dos2unix', которая может помочь. Вы можете вызвать его из php как системный вызов.

Или я уверен, что есть версия php того же самого.

Но я не php парень.

0 голосов
/ 24 июня 2009

РЕДАКТИРОВАТЬ: я не знал, что о цитировании PHP. Тем не менее, вам может потребоваться выбрать стандартную кодировку, когда будет использоваться несколько языков, остальная часть этого поста все еще действительна.

Windows обычно использует файлы в кодировке ANSI или ASCII для текста, используя набор символов, локальный для системы. (Например, cp1252).

Может быть, проще всего просто закодировать все это в UTF8, а затем указать блокноте прочитать файл как документ UTF8. (Это раскрывающийся список в диалоговом окне Файл-> Открыть.)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...