Вроде вопрос простой, но то ли я туплю, то ли одно из двух… Есть исходный текст в многобайтовом представлении (допустим, UTF-8). Нужно вывести его на веб-страницу, отдаваемую в однобайтовой кодировке (допустим, windows-1251), но не просто абы как, а чтобы: все символы, представимые в веб-кодировке, выводились бы одним байтом; символы, не имеющие представления в веб-кодировке, выводились бы в виде HTML-сущностей (Ӓ или &entity; — без разницы); опционально — экранирование спецсимволов HTML. Входная и выходная кодировки, вообще говоря, не фиксированные. Сейчас использую костыльное решение: Код (Text): htmlspecialchars( mb_convert_encoding($strText, 'HTML-ENTITIES', $strSourceEncoding), ENT_QUOTES | ENT_DISALLOWED | ENT_HTML401, $strWebEncoding, FALSE ) Оно работоспособно, но вся кириллица выводится в виде Ӓ — проще тогда уж всю страницу сразу было бы в UTF-8 отдавать. Вообще, я думал, что должна существовать штатная функция для выполнения подобных преобразований в одно действие, что-то типа такого: Код (Text): htmlentities( $strText, ENT_QUOTES | ENT_DISALLOWED | ENT_HTML401, $strWebEncoding, $strSourceEncoding ) Но нет — функции htmlspecialchars и htmlentities работают только в рамках одной исходной кодировки. В комментариях к документации PHP народ предлагает всяческие велосипеды на каждый узкоспецифичный случай, но хотелось бы обойтись без них.
Судя по отсутствию конкретных решений в ответах, приходится делать вывод, что никакого тривиального решения действительно не существует; разработчики PHP, порождая свисто-перделки типа get_html_translation_table, забывают о самом простейшем сценарии использования. Если кому интересно, наткнулся на такое вот извращённое многократное преобразование туда-сюда-обратно (привожу пошагово для облегчения понимания): Код (Text): $strSourceEncoding = 'UTF-8'; $strWebEncoding = 'windows-1251'; $strText = mb_convert_encoding($strText, 'HTML-ENTITIES', $strSourceEncoding); $strText = html_entity_decode($strText, ENT_QUOTES, $strWebEncoding); $strText = htmlspecialchars($strText, ENT_QUOTES, $strWebEncoding); Костыль тот ещё, но зато выдаёт именно то, что надо, при этом не являясь велосипедом. В виде UTF-8 — как раз-таки не стремлюсь. Страница отдаётся в однобайтовой кодировке, поскольку текст на ней преимущественно русский, — использование Юникода привело бы к неоправданному увеличению размера. Собственно, со статическим текстом и так проблем не было: поскольку он заведомо вписывается в кодовую страницу того языка, для которого предназначен, то для него достаточно mb_convert_encoding. Проблема была только с динамическим текстом, поскольку он, вообще говоря, может быть на любом языке, да и спецсимволы в нём экранировать надо.
Я думаю, что большинство отдаёт русский текст в utf-8 и не заморачивается лишними байтами. И ещё я думаю, что это нормально Ещё под вопросом, что создаст большую нагрузку на сервер - эти лишние байты траффика или твои преобразования туда-сюда...
короче проблема надуманная, решение всегда будет неоптимальным. но больших сложностей с конвертированием я не вижу, кроме как если ну тогда ой. потому и была выдумана мультибайтная кодировка, чтобы с этими проблемами не бороться. делай на utf8