За последние 24 часа нас посетили 26198 программистов и 1814 роботов. Сейчас ищут 1022 программиста ...

Проблема с кодировкой

Тема в разделе "Прочие вопросы по PHP", создана пользователем FiMka, 12 май 2009.

  1. FiMka

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

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Добрый день.

    Пробовал искать ответа в сети и на на форуме, не помогло.
    У меня проблема такого рода: есть Страница в кодировке win1251 и Страница в кодировке utf8
    Содержимое страницы win1251 (сохранена в кодировке ANSI):
    PHP:
    1. <META content="text/html"; charset="windows-1251" http-equiv="Content-Type">
    2. <?php setlocale(LC_ALL, "ru_RU.CP1251");
    3.     print("Это просто текст");
    4. ?>
    Содержимое страницы utf8 (сохранена в кодировке UTF-8 ) :
    PHP:
    1. <META content="text/html"; charset="utf8" http-equiv="Content-Type">
    2. <?php setlocale(LC_ALL, "UTF8");
    3.     print("Это просто текст");
    4. ?>
    В первом случае нормальное отображение текста возможно только после переключения на кодировку windows-1251 из браузера, во втором случае (для странцы в utf8) всегда вопросики.

    Кто-нибудь может подсказать как это исправить? Заранее большое спасибо!
     
  2. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Очень сильно сомневаюсь, что файл сохранен у вас в должной кодировке.
    Именно сохранен, дело не в локали.
    Даже если вы ничего не укажете в meta-тегах, браузер поймет и отобразит файл в той кодировке, в которой он сохранен.
    Потому что он отдается именно с таким контентом.
    Учтите это.
     
  3. FiMka

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

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Перепроверил, все как я написал, у того, что в кодировке win1251 - ANSI, у второго UTF-8, использую редактор Notepad++.
     
  4. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Создал у себя два файла:

    PHP:
    1. <?php
    2.  
    3. echo 'Файл сохранен в кодировке UTF-8';
    4.  
    5. ?>
    http://80.235.58.35/utf8.php
    http://80.235.58.35/win1251.php

    Это подтверждает только то, что символы документа не соответствуют принятым с установленной кодировкой.
    Попробуйте посредственную конвертацию windows-1251 в UTF-8 через iConv, чтобы убедиться в этом.
     
  5. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    FiMka
    cp1251, win1251, utf8 -- пишется в MySQL.

    Попробуйте windows-1251, utf-8
     
  6. FiMka

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

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Я не шибко знаток, что-то не так сделал :) ? Посмотрите, пожалуйста.

    Код (Text):
    1. $ more utf8.php | iconv -c -f CP1251 -t utf-8 > 1.php
    2. $ more 1.php
    3. <D0><BF><C2><BB><D1><97><META content="text/html"; charset="utf8" http-equiv="Content-Type">
    4. <?php setlocale(LC_ALL, "UTF8");
    5.         print("<D0><A0><C2><AD><D0><A1><E2><80><9A><D0><A0><D1><95> <D0><A0><D1><97><D0><A1><D0><82><D0><A0><D1><95><D0><A1><D0><83><D0><A1><E2><80><9A><D0><A0><D1><95> <D0><A1><E2><80><9A><D0><A0><C2><B5><D0><A0><D1><94><D0><A1><D0><83>
    6. <D0><A1><E2><80><9A>");
    7. ?>
    Код (Text):
    1. $ more win1251.php | iconv -c -f utf-8 -t CP1251 > 2.php
    2. $ more 2.php
    3. <META content="text/html"; charset="windows-1251" http-equiv="Content-Type">
    4. <?php setlocale(LC_ALL, "ru_RU.CP1251");
    5.         print("  ");
    6. ?>
    Результаты, соответственно в http://www.englishelp.ru/tmp/1.php и http://www.englishelp.ru/tmp/2.php
     
  7. FiMka

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

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Попробовал. Теперь лежат utf8.php и win1251.php так, как вы указали - результат тот же . :(
     
  8. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
     
  9. FiMka

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

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Все равно
     
  10. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Файл сохранен в кодировке, отличной от отдаваемой.
    Я заявил об этом несколько раз.
    Сохраняйте другим редактором.
     
  11. FiMka

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

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Нет.
    Тот же самый utf8.php на другом хостинге - http://www.mfilkov.tu1.ru/utf8.php[/url]
    Для http://www.englishelp.ru/tmp/win1251.php помогло вот так:
    PHP:
    1. <?php header( 'content-type: text/html; charset=windows-1251' );
    2.     print("Это просто текст");
    3. ?>
    Для http://www.englishelp.ru/tmp/utf8.php не помогло (а нужна именно utf8):
    PHP:
    1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    2. <?php //header( 'content-type: text/html; charset=utf-8' );
    3.     print("Это просто текст");
    4. ?>
     
  12. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    У вас случайно не стоит такой дефективный монстр, как русский Апач?
     
  13. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    apache -> httpd.conf -> AddDefaultCharset

    PHP:
    1. <? header('Content-Type: text/html; charset=utf-8');
     
  14. FiMka

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

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Никогда не задумывался, какая переменная покажет локализацию апача? А так Apache/1.3.41 (Unix) PHP/5.2.8.
     
  15. FiMka

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

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    httpd.conf править не могу, не имею доступа - хостинг платный, добавил в директорию .htaccess со строчкой AddDefaultCharset utf-8 - результат тот же. Может неправильно вас понял в чем-то?
     
  16. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Сейчас попробуем буферизацию и конвертацию ....
     
  17. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
  18. FiMka

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

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Вот он http://www.englishelp.ru/tmp/Data.txt. Кодировка ANSI, отображается неправильно, т.к. сервер хостера возвращает по умолчанию utf8.
     
  19. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Тогда пробуем сделать так:

    PHP:
    1. <?php
    2.  
    3.  
    4.  
    5. /**
    6.  * Тут начинаем генерацию и выдачу любого контента
    7.  */
    8. $hello = 'Привет';
    9. $world = 'мир';
    10.  
    11. echo $hello.', '.$world;
    12.  
    13.  
    14. /**
    15.  * Конвертируем
    16.  */
    17. $flush = iconv('WINDOWS-1251', 'UTF-8', ob_get_contents());
    18.  
    19. /**
    20.  * Плюём
    21.  */
    22. echo $flush;
    23.  
    24. ?>
     
  20. FiMka

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

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Apple, you've got it :D!
    http://www.englishelp.ru/tmp/test.php
    PHP:
    1. <?php
    2.     error_reporting(E_ALL);
    3.  
    4.     ob_start(); // включить буферизацию вывода
    5.     ob_implicit_flush(0); // отключить неявную очистку
    6.  
    7.     $hello = 'Привет';
    8.     $world = 'мир';
    9.  
    10.     echo $hello.', '.$world;
    11.  
    12.     // конвертируем
    13.     $flush = iconv('WINDOWS-1251', 'UTF-8',
    14.         ob_get_contents() // получить содержимое буфера
    15.     );
    16.     ob_end_clean(); // очистить содержимое буфера
    17.  
    18.     echo $flush;
    19.  ?>
    А можете немножко прокомментировать что это такое с буфером делается ? :)
     
  21. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Мы буферизируем весь генерируемый контент от начала до конца, а потом перегоняем его в UTF-8 перед отдачей с помощью iConv.
    А теперь, если нет больше вопросов, пойду почитаю. :)
     
  22. FiMka

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

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Виртуально жму руку! Удачно почитать :D

    ЗЫ: и все же это больше на workaround походит, так в чем же была проблема?
     
  23. да еще на какой! )
     
  24. FiMka

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

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Да, но другого решения нет-с, потому использую это.
     
  25. я честно тему перечитал раза три, но не понял сути проблемы.