Есть легаси таблица в кодировке koi8r и админка через которую вносят в неё текст, который зачастую содержит не поддерживаемые символы вроде знака рубля (с фронта данные прилетают в utf-8).
Соответственно встала задача уведомлять пользователей о попытках внести текст с не поддерживаемыми символами.
Единственное что приходит на ум - это конвертнуть строку в koi8r и сравнить посимвольно, но возможно есть какие-то более элегантные варианты?
P.S. увы, возможности сменить кодировку таблицы нет
Если таблица только для хранения, а работу с ней можно поменять - можно хранить base64 :)
Можно сочинить собственную таблицу конвертации для тех символов, которые из верхней половины KOI соответствуют тому, что вообще могут прислать в уникоде (псевдографику - вряд ли) и добавить замены для того же рубля на "руб.", например. В общем, написать свое с блэк-джеком, раз уж приходится работать с... легаси.
Не нужно сравнивать, просто на фронте разрешите только те символы, которые нормально конвертируются.
Либо как предложил Adamos, храните в base64, или в json с преобразованием utf в коды.
Написано
Антон Шаманов
@SilenceOfWinter Автор вопроса, куратор тега PHP
Vitsliputsli, там висивиг редактор т.ч. ограничить проблематично. кодировку таблицы нельзя сменить как раз по причине того, что есть другие приложения использующие таблицу, поэтому хранить в другом формате не вариант.
Странно, неужели не умеет такое из коробки? Тем не менее это наиболее простой для вас и наиболее удобный для пользователя вариант, если не менять таблицу.
кодировку таблицы нельзя сменить как раз по причине того, что есть другие приложения использующие таблицу, поэтому хранить в другом формате не вариант.
Это проблема, если в БД пишет код, которым вы не управляете, такое чревато.
Антон Шаманов , а в таблице хранится именно текст или таки html? Если второе то можно просто кодировать все "лишние" символы как html-entity: ©.
Как-то так(не большой знаток php):
Двойной конверт через iconv() нормальный и "не дорогой" вариант utf8 -> koi8r -> utf8
Можно используйте флаги типа //TRANSLIT или //IGNORE
Соотв-но если изначальный utf8 не равен итоговому utf8 значит в исходной строке были символы вне кодовой таблицы koi8r
Так же можно попробовать часто-используемые символы типа символа рубля закодировать в ₽ или ₽. Естественно если при отображении данных делается escaping для html (html_entity_encode / htmlspecialchars) это надо будет учесть чтобы & не превратился в &
Михаил Ливач, да, согласен, можно посимвольно сравнить. Тогда замечание снимается.
Но я бы в этом случае просто белый список символов сделал прямо на фронте.
Написано
Антон Шаманов
@SilenceOfWinter Автор вопроса, куратор тега PHP
Vitsliputsli, интересная идея, а есть какие-то решения для конвертации текста на js?
Антон Шаманов, а зачем конвертация? При вводе с клавиатуры проверяем по белому списку посимвольно; что ввелось, то точно конвертируется на бэкенде. Для Copy/Paste тоже, думаю, есть решение
Написано
Антон Шаманов
@SilenceOfWinter Автор вопроса, куратор тега PHP
так, а зачем двойной конверт? utf8 -> koi8r//TRANSLIT вроде нормально справился
Антон Шаманов, а что произошло с неподдерживаемыми символами?
Написано
Антон Шаманов
@SilenceOfWinter Автор вопроса, куратор тега PHP
Михаил Ливач, они конвертировались, например, — в --, мои коллеги грешили знаками валюты, тире и кавычками т.ч. для моей задачи этого вполне достаточно оказалось