файлы, сохраненные из браузера в кодировке UTF-8 и кодировке ANSI - почему?

У меня есть два сайта, которые я разрабатываю (на PHP). Они используют идентичный код для экспорта XLS (с использованием PEAR excel) и работают на одном локальном сервере. Чтобы исключить проблему с фактическими данными в xls, я просто вывожу файл без данных на данный момент.

Когда я экспортирую с сайта A и сохраняю файл, он отображается как «ANSI», закодированный в Notepad ++. Этот файл правильно открывается в Excel.

Когда я экспортирую с сайта B, файл отображается в кодировке «UTF-8», файл не открывается в Excel. Если я конвертирую файл в ANSI или UTF-8 без спецификации в Textpad ++, он отлично открывается в Excel.

Такая же разница в кодировке присутствует между сайтами A и B, когда я сохраняю произвольную страницу на сайте, поэтому я думаю, что это может быть более фундаментальным, чем просто создание файла Excel (такая же кодировка при экспорте форматов CSV / ODS). Я сравнил заголовки http между сайтами A и B во время экспорта, они функционально идентичны. Явное добавление Charset = ISO-8859-1 в заголовок не имеет значения. Виртуальные хосты apache также функционально идентичны между сайтами. Оба сайта используют идентичные кодировки символов в своих базах данных (но поскольку я сейчас не экспортирую никаких данных, это не имеет значения).

Что еще могло быть причиной этого, чего я не объяснил?

Спасибо!

ОБНОВЛЕНИЕ

Генерация excel - отвлекающий маневр, я удалил все это и просто вывел заголовок загрузки и тестовую строку. При сохранении файл по-прежнему кодируется по-разному для разных сайтов. Код, который генерирует файл загрузки, кажется идентичным, когда я сравниваю различные файлы ...

Мне не удалось повторить проблему, создав упрощенный тестовый пример. Когда я попробовал, оба сайта выводят файлы, которые сохраняются как ANSI - я не понимаю, что еще может происходить.


person Frank D    schedule 22.05.2012    source источник
comment
Что вы видите в шестнадцатеричном редакторе?   -  person SLaks    schedule 22.05.2012
comment
предполагая, что содержимое, используемое для создания файла, идентично байту за байтом, и что веб-сервер не меняет кодировку на лету, это должно быть сделано библиотекой генерации Excel. Я бы начал поискать исходный код.   -  person goat    schedule 22.05.2012
comment
Байты файлов в шестнадцатеричном редакторе различаются. Я не понимаю, почему веб-сервер меняет кодировку, поскольку это тот же сервер с той же настройкой vhost. Код кажется идентичным, когда я сравниваю ... Интересно, сохранены ли некоторые исходные файлы php с разными кодировками, но еще не найдены ...   -  person Frank D    schedule 22.05.2012


Ответы (2)


"режим" ANSI просто использует языковую таблицу, имеющуюся в вашей системе, для сохранения данных; вы не можете быть уверены, что сохраненный документ будет виден другим.

UTF-8 без спецификации означает utf8, но без добавления некоторых странных символов utf (2 или 3, я думаю, в верхней части файла), что, вероятно, вызывает головную боль Excel.

Я всегда буду использовать подход без бомбы, если я думаю i18n

person Community    schedule 22.05.2012
comment
ANSI использует системную кодовую страницу, она будет доступна для чтения, только если другой конец использует ту же кодовую страницу. - person SLaks; 22.05.2012
comment
Да, это не очень помогает. Сайт A сохраняет файлы из браузера в формате ANSI (Windows-1252), чего я и хочу. Сайт B (идентичный код, тот же сервер) сохраняет файлы в UTF-8, которые не работают, если они являются файлами Excel. - person Frank D; 22.05.2012
comment
Отличаются ли настройки по умолчанию на двух сайтах? Возможно, в одном из них включен параметр «Всегда сохранять как UTF-8», а в другом - нет. - person rossum; 22.05.2012
comment
@rossum Где эти настройки определены? (проблема возникает во всех браузерах) - person Frank D; 22.05.2012
comment
@Frank D: Я не знаю, где определены настройки. Между вашими двумя сайтами что-то различается, иначе они выдали бы одинаковый результат. Придется прочитать инструкцию Ужас! Ужас! :) - person rossum; 22.05.2012

Спасибо за ваш вклад, мы очень ценим это. В конце концов, я отследил это, где-то по пути был включен исходный файл PHP, который был закодирован в UTF-8, а не в ANSI (Windows-1252). Я действительно не понимаю, почему это вызывает проблему, поскольку включение PHP ничего не выводит. Очень странно и очень расстраивает, надеюсь, может быть, кто-то еще сочтет мою боль полезной.

person Frank D    schedule 22.05.2012