Добрый день.
Получаю строку с телеграма. В ней есть смайлик-эмодзи
Сохраняю строку в лог файл в UTF-8 там смайлик потом в Notepad++ отображается.
Но при сохранении в MSSQL который в cp1251 "карета превращается в тыкву" т.е. записываются символы "знак вопроса".
Но эти записи потом используются для формирования ответа с цитированием.
Поэтому смайлы надо как-то переконвертировать туда и обратно, чтобы хранить в каком-то коде в cp1251 и потом при передаче по HTTP в UTF-8 кодировать обратно.
Кто-нибудь знает как решать такую задачу?
Telegram, emoji, кодировка cp1251 как сохранять?
Модератор: Модераторы
-
xchgeaxeax
- постоялец
- Сообщения: 207
- Зарегистрирован: 11.05.2023 02:51:40
Для начала потрудитесь изучить различия 1251 и UTF-8. У 1251 всего 256 символов и все заняты знаками. Где вы собрались хранить смайлы. Проще в базе данных поменять кодировку сохранения текста.
Это один вариант.xchgeaxeax писал(а):Проще в базе данных поменять кодировку сохранения текста.
а второй, как то сделать представление в виде кодов
-
xchgeaxeax
- постоялец
- Сообщения: 207
- Зарегистрирован: 11.05.2023 02:51:40
Только если для каждого смайла определить таблицу соответствия строковым шаблонам и заменять их (смайлы) в строке UTF-8 на эти шаблоны. После считывания из базы и преобразования обратно придется сделать обратную замену. Это куда длиннее и менее практичнее, чем использование одной кодировки без ненужных преобразований.
Добавлено спустя 5 минут 26 секунд:
Как вы себе представляете сокращение количества знаков с более чем 1 миллиона (для UTF-8) до 256 (для 1251) без каких-либо ухищрений и соответствующее обратное преобразование.
Добавлено спустя 5 минут 26 секунд:
Как вы себе представляете сокращение количества знаков с более чем 1 миллиона (для UTF-8) до 256 (для 1251) без каких-либо ухищрений и соответствующее обратное преобразование.
Это правильный вариант. Не один, а единственный. Все остальное - костыли и грабли.jsa писал(а):Это один вариант
-
xchgeaxeax
- постоялец
- Сообщения: 207
- Зарегистрирован: 11.05.2023 02:51:40
Если совсем не можете изменить тип хранимых данных в базе, тогда просто используйте Base64 для преобразования RawByteString и обратно (преобразовывать UTF-8 к RawByteString не нужно). Base64 текст вполне себе нормально представляется в 1251 без искажений, а UTF-8 строка останется без изменений.
Но это просто костыли. Проще действительно изменить формат поля для сохранения текста в базе данных.
Но это просто костыли. Проще действительно изменить формат поля для сохранения текста в базе данных.
stikriz11 писал(а):Это правильный вариант. Не один, а единственный. Все остальное - костыли и грабли.
Прошу прощения, сказочно затупилxchgeaxeax писал(а): Проще действительно изменить формат поля для сохранения текста в базе данных.
Код: Выделить всё
update tbl set jsonUTF8=N' смайл1 смайл2 test тест' where id=10
-- где jsonUTF8 Nvarchar(max)
select jsonUTF8, * from tbl where id=10
-- выдает тоже самое без искажения.
Выдает ошибку со сбитой кодировкой.
Похоже движок форума тоже не понимает смайлы.
заменил на смайл1 и смайл2
- Vapaamies
- постоялец
- Сообщения: 292
- Зарегистрирован: 24.07.2012 22:37:59
- Откуда: Санкт-Петербург
- Контактная информация:
Угу. На предпросмотре показывает, а в базу не отправляет. То есть PHP уже поддерживает, а в MySQL нужно перейти на utf8mb4.jsa писал(а):Похоже движок форума тоже не понимает смайлы.
