За последние 24 часа нас посетили 18468 программистов и 1798 роботов. Сейчас ищут 845 программистов ...

Помогите решить проблему с кодировкой (чтение xls)

Тема в разделе "PHP для новичков", создана пользователем Professor, 16 авг 2010.

  1. Professor

    Professor Активный пользователь

    С нами с:
    2 янв 2008
    Сообщения:
    121
    Симпатии:
    0
    Адрес:
    г. Одесса, Украина
    Парсю xls файл библиотекой PHPExcel. Считываю русские строки. Мощнейшая библиотека, казалось бы, в ней то учтены все мелочи, включая вопросы с кодировкой. Однако нет. На их issue tracker-e с подобной проблемой сталкивались только косвенно, мне их решение не помогло. Опубликовал у них - ничего связного никто не ответил.

    Суть проблемы. Я получаю строку из файла, она приходит (выводится в браузере) неизменно вот в таком виде (в смысле, набор символов, конечно, от строки к строке меняется):
    Ïîëþñòðîâî-Ñïá
    или
    ÎÀÎ Óí-ì Ôðóíçåíñêèé
    или
    ÎÎÎ Øàðèíîâ

    mb_detect_encoding () возвращает, что строка в UTF-8.
    В head страницы
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    В базу данных записывается так же, collation стоит utf-8, все таблицы в utf-8, сама база в utf-8. Проверял и на локалке, и на хостинге.

    А теперь самое интересное. Если файл создан в системе (winXP), т.е. самим Microsoft Excel'ем, то парсится он великолепно. Однако задача такова, что файлы экспортируются из Access. И вот именно эти файлы я не могу нормально прочитать.

    Ещё одно наблюдение интересное:
    убрал из заголовка
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    и при извлечении полученную строку конвертирую вот так:
    echo iconv ("UTF-8", "ISO-8859-1", $str);
    получаю нормальный русский язык

    добавляю в заголовок
    <meta http-equiv="content-type" content="text/html; charset=windows-1251" />
    снова получаю нормальные русские символы

    убрал из заголовка мета тег и сделал следующиее
    echo iconv ("ISO-8859-1", "UTF-8", iconv ("UTF-8", "ISO-8859-1", $str));
    снова получил кривой код, добавление мета тега с charset=utf-8 не помогает

    Найдётся кто то компетентный в вопросах кодировок, кто сможет проанализировать предоставленный мной наблюдаемый эффект и помочь разобраться в проблеме ?
    Сам я не настолько компетентен, что бы разобраться в чём тут дело... к сожалению.

    Есть идеи ?
     
  2. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    вещь хорошая, но сказать однозначно что бровзером все что вы выведете будет воспринято как юникод нельзя. Зависит от настроек апача (или пхп. Сейчас не вспомню). По этому, отправляем перед выводом нужный header.
    Остальное. С кодировками все просто. Текст, как таковой не имеет кодировки. Это (как 100 раз уже говорилось) набор данных. Программа, которая отображает его должна определить (либо вы за нее) в какой кодировке отобразить.
    Теперь, сверху смотрим на всю проблему. А она у нас совсем маленькая. Надо понять в какой кодировке информация, высыпаемая, в вашем случае, акцессом.

    В какой кодировке у вас работает браузер можно спокойно посмотреть через "вид". Экспорт, я предполагаю - 1258, т.к. виндовс.
     
  3. Professor

    Professor Активный пользователь

    С нами с:
    2 янв 2008
    Сообщения:
    121
    Симпатии:
    0
    Адрес:
    г. Одесса, Украина
    Насчёт header'а - пробовал раньше, не помогало.

    Да, с кодировками всё, казалось бы, просто. Но не зря ведь возникает столько проблем, связанных с ними)

    Насчёт кодировки: теоретически - все данные в xls файлах хранятся в utf-8, практически же у меня не получалось конвертнуть ни в какую другую кодировку эти данные, пытался даже обрезать первые 3 байта (BOM) - не в том было дело.

    По сабжу: сменил библиотеку, и после некоторых манипуляций с iconv() заставил работать как требуется. Трясусь от страха и боюсь шевельнуть пальцем что бы не вернуть старые проблемы.