За последние 24 часа нас посетил 17851 программист и 1648 роботов. Сейчас ищут 878 программистов ...

Оптимальное преобразование Юникода в 1-байтовый HTML

Тема в разделе "PHP для новичков", создана пользователем Samsonov, 2 окт 2012.

  1. Samsonov

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

    С нами с:
    31 мар 2011
    Сообщения:
    12
    Симпатии:
    0
    Адрес:
    DC
    Вроде вопрос простой, но то ли я туплю, то ли одно из двух…

    Есть исходный текст в многобайтовом представлении (допустим, UTF-8). Нужно вывести его на веб-страницу, отдаваемую в однобайтовой кодировке (допустим, windows-1251), но не просто абы как, а чтобы:
    • все символы, представимые в веб-кодировке, выводились бы одним байтом;
    • символы, не имеющие представления в веб-кодировке, выводились бы в виде HTML-сущностей (Ӓ или &entity; — без разницы);
    • опционально — экранирование спецсимволов HTML.
    Входная и выходная кодировки, вообще говоря, не фиксированные.

    Сейчас использую костыльное решение:
    Код (Text):
    1. htmlspecialchars(
    2.  mb_convert_encoding($strText, 'HTML-ENTITIES', $strSourceEncoding),
    3.  ENT_QUOTES | ENT_DISALLOWED | ENT_HTML401,
    4.  $strWebEncoding,
    5.  FALSE
    6. )
    Оно работоспособно, но вся кириллица выводится в виде Ӓ — проще тогда уж всю страницу сразу было бы в UTF-8 отдавать.

    Вообще, я думал, что должна существовать штатная функция для выполнения подобных преобразований в одно действие, что-то типа такого:
    Код (Text):
    1. htmlentities(
    2.  $strText,
    3.  ENT_QUOTES | ENT_DISALLOWED | ENT_HTML401,
    4.  $strWebEncoding,
    5.  $strSourceEncoding
    6. )
    Но нет — функции htmlspecialchars и htmlentities работают только в рамках одной исходной кодировки. В комментариях к документации PHP народ предлагает всяческие велосипеды на каждый узкоспецифичный случай, но хотелось бы обойтись без них.
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Вам не то, не то не надо, а что тогда вы хотите, раз у вас ничего нет?
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ради какого лешего ты так стремишься отдавать их в таком виде?
     
  4. Samsonov

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

    С нами с:
    31 мар 2011
    Сообщения:
    12
    Симпатии:
    0
    Адрес:
    DC
    Судя по отсутствию конкретных решений в ответах, приходится делать вывод, что никакого тривиального решения действительно не существует; разработчики PHP, порождая свисто-перделки типа get_html_translation_table, забывают о самом простейшем сценарии использования.

    Если кому интересно, наткнулся на такое вот извращённое многократное преобразование туда-сюда-обратно (привожу пошагово для облегчения понимания):
    Код (Text):
    1. $strSourceEncoding = 'UTF-8';
    2. $strWebEncoding = 'windows-1251';
    3.  
    4. $strText = mb_convert_encoding($strText, 'HTML-ENTITIES', $strSourceEncoding);
    5. $strText = html_entity_decode($strText, ENT_QUOTES, $strWebEncoding);
    6. $strText = htmlspecialchars($strText, ENT_QUOTES, $strWebEncoding);
    Костыль тот ещё, но зато выдаёт именно то, что надо, при этом не являясь велосипедом.

    В виде UTF-8 — как раз-таки не стремлюсь. Страница отдаётся в однобайтовой кодировке, поскольку текст на ней преимущественно русский, — использование Юникода привело бы к неоправданному увеличению размера. Собственно, со статическим текстом и так проблем не было: поскольку он заведомо вписывается в кодовую страницу того языка, для которого предназначен, то для него достаточно mb_convert_encoding. Проблема была только с динамическим текстом, поскольку он, вообще говоря, может быть на любом языке, да и спецсимволы в нём экранировать надо.
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Я думаю, что большинство отдаёт русский текст в utf-8 и не заморачивается лишними байтами. И ещё я думаю, что это нормально :) Ещё под вопросом, что создаст большую нагрузку на сервер - эти лишние байты траффика или твои преобразования туда-сюда...
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    беда. порнушку ты тоже не качаешь? это ж тысячи мегабайт...
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А почему бы тогда сразу все тексты не делать в windows-1251?
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    короче проблема надуманная, решение всегда будет неоптимальным. но больших сложностей с конвертированием я не вижу, кроме как если
    ну тогда ой.

    потому и была выдумана мультибайтная кодировка, чтобы с этими проблемами не бороться.

    делай на utf8