Добрый день. Пробовал искать ответа в сети и на на форуме, не помогло. У меня проблема такого рода: есть Страница в кодировке win1251 и Страница в кодировке utf8 Содержимое страницы win1251 (сохранена в кодировке ANSI): PHP: <META content="text/html"; charset="windows-1251" http-equiv="Content-Type"> <?php setlocale(LC_ALL, "ru_RU.CP1251"); print("Это просто текст"); ?> Содержимое страницы utf8 (сохранена в кодировке UTF-8 ) : PHP: <META content="text/html"; charset="utf8" http-equiv="Content-Type"> <?php setlocale(LC_ALL, "UTF8"); print("Это просто текст"); ?> В первом случае нормальное отображение текста возможно только после переключения на кодировку windows-1251 из браузера, во втором случае (для странцы в utf8) всегда вопросики. Кто-нибудь может подсказать как это исправить? Заранее большое спасибо!
Очень сильно сомневаюсь, что файл сохранен у вас в должной кодировке. Именно сохранен, дело не в локали. Даже если вы ничего не укажете в meta-тегах, браузер поймет и отобразит файл в той кодировке, в которой он сохранен. Потому что он отдается именно с таким контентом. Учтите это.
Перепроверил, все как я написал, у того, что в кодировке win1251 - ANSI, у второго UTF-8, использую редактор Notepad++.
Создал у себя два файла: PHP: <?php echo 'Файл сохранен в кодировке UTF-8'; ?> http://80.235.58.35/utf8.php http://80.235.58.35/win1251.php Это подтверждает только то, что символы документа не соответствуют принятым с установленной кодировкой. Попробуйте посредственную конвертацию windows-1251 в UTF-8 через iConv, чтобы убедиться в этом.
Я не шибко знаток, что-то не так сделал ? Посмотрите, пожалуйста. Код (Text): $ more utf8.php | iconv -c -f CP1251 -t utf-8 > 1.php $ more 1.php <D0><BF><C2><BB><D1><97><META content="text/html"; charset="utf8" http-equiv="Content-Type"> <?php setlocale(LC_ALL, "UTF8"); 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> <D0><A1><E2><80><9A>"); ?> Код (Text): $ more win1251.php | iconv -c -f utf-8 -t CP1251 > 2.php $ more 2.php <META content="text/html"; charset="windows-1251" http-equiv="Content-Type"> <?php setlocale(LC_ALL, "ru_RU.CP1251"); print(" "); ?> Результаты, соответственно в http://www.englishelp.ru/tmp/1.php и http://www.englishelp.ru/tmp/2.php
Файл сохранен в кодировке, отличной от отдаваемой. Я заявил об этом несколько раз. Сохраняйте другим редактором.
Нет. Тот же самый utf8.php на другом хостинге - http://www.mfilkov.tu1.ru/utf8.php[/url] Для http://www.englishelp.ru/tmp/win1251.php помогло вот так: PHP: <?php header( 'content-type: text/html; charset=windows-1251' ); print("Это просто текст"); ?> Для http://www.englishelp.ru/tmp/utf8.php не помогло (а нужна именно utf8): PHP: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <?php //header( 'content-type: text/html; charset=utf-8' ); print("Это просто текст"); ?>
Никогда не задумывался, какая переменная покажет локализацию апача? А так Apache/1.3.41 (Unix) PHP/5.2.8.
httpd.conf править не могу, не имею доступа - хостинг платный, добавил в директорию .htaccess со строчкой AddDefaultCharset utf-8 - результат тот же. Может неправильно вас понял в чем-то?
Попробуйте. Посмотрите кодировку файла Data.txt PHP: <?php ob_start(); ob_implicit_flush(0); echo 'Тут мы плюём контент'; file_put_contents('Data.txt', ob_get_contents()); ob_end_clean(); echo 'Done'; ?>
Вот он http://www.englishelp.ru/tmp/Data.txt. Кодировка ANSI, отображается неправильно, т.к. сервер хостера возвращает по умолчанию utf8.
Тогда пробуем сделать так: PHP: <?php error_reporting(E_ALL); ob_start(); ob_implicit_flush(0); /** * Тут начинаем генерацию и выдачу любого контента */ $hello = 'Привет'; $world = 'мир'; echo $hello.', '.$world; /** * Конвертируем */ $flush = iconv('WINDOWS-1251', 'UTF-8', ob_get_contents()); ob_end_clean(); /** * Плюём */ echo $flush; ?>
Apple, you've got it ! http://www.englishelp.ru/tmp/test.php PHP: <?php error_reporting(E_ALL); ob_start(); // включить буферизацию вывода ob_implicit_flush(0); // отключить неявную очистку $hello = 'Привет'; $world = 'мир'; echo $hello.', '.$world; // конвертируем $flush = iconv('WINDOWS-1251', 'UTF-8', ob_get_contents() // получить содержимое буфера ); ob_end_clean(); // очистить содержимое буфера echo $flush; ?> А можете немножко прокомментировать что это такое с буфером делается ?
Мы буферизируем весь генерируемый контент от начала до конца, а потом перегоняем его в UTF-8 перед отдачей с помощью iConv. А теперь, если нет больше вопросов, пойду почитаю.
Виртуально жму руку! Удачно почитать ЗЫ: и все же это больше на workaround походит, так в чем же была проблема?