Telegram, emoji, кодировка cp1251 как сохранять?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Telegram, emoji, кодировка cp1251 как сохранять?

Сообщение jsa »

Добрый день.

Получаю строку с телеграма. В ней есть смайлик-эмодзи
Сохраняю строку в лог файл в UTF-8 там смайлик потом в Notepad++ отображается.
Но при сохранении в MSSQL который в cp1251 "карета превращается в тыкву" т.е. записываются символы "знак вопроса".

Но эти записи потом используются для формирования ответа с цитированием.
Поэтому смайлы надо как-то переконвертировать туда и обратно, чтобы хранить в каком-то коде в cp1251 и потом при передаче по HTTP в UTF-8 кодировать обратно.

Кто-нибудь знает как решать такую задачу?
xchgeaxeax
постоялец
Сообщения: 207
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

Для начала потрудитесь изучить различия 1251 и UTF-8. У 1251 всего 256 символов и все заняты знаками. Где вы собрались хранить смайлы. Проще в базе данных поменять кодировку сохранения текста.
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

xchgeaxeax писал(а):Проще в базе данных поменять кодировку сохранения текста.
Это один вариант.
а второй, как то сделать представление в виде кодов
xchgeaxeax
постоялец
Сообщения: 207
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

Только если для каждого смайла определить таблицу соответствия строковым шаблонам и заменять их (смайлы) в строке UTF-8 на эти шаблоны. После считывания из базы и преобразования обратно придется сделать обратную замену. Это куда длиннее и менее практичнее, чем использование одной кодировки без ненужных преобразований.

Добавлено спустя 5 минут 26 секунд:
Как вы себе представляете сокращение количества знаков с более чем 1 миллиона (для UTF-8) до 256 (для 1251) без каких-либо ухищрений и соответствующее обратное преобразование.
stikriz11
постоялец
Сообщения: 136
Зарегистрирован: 04.09.2023 14:54:19

Сообщение stikriz11 »

jsa писал(а):Это один вариант
Это правильный вариант. Не один, а единственный. Все остальное - костыли и грабли.
xchgeaxeax
постоялец
Сообщения: 207
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

Если совсем не можете изменить тип хранимых данных в базе, тогда просто используйте Base64 для преобразования RawByteString и обратно (преобразовывать UTF-8 к RawByteString не нужно). Base64 текст вполне себе нормально представляется в 1251 без искажений, а UTF-8 строка останется без изменений.

Но это просто костыли. Проще действительно изменить формат поля для сохранения текста в базе данных.
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

stikriz11 писал(а):Это правильный вариант. Не один, а единственный. Все остальное - костыли и грабли.
xchgeaxeax писал(а): Проще действительно изменить формат поля для сохранения текста в базе данных.
Прошу прощения, сказочно затупил :oops:

Код: Выделить всё


update tbl set jsonUTF8=N'  смайл1 смайл2  test тест' where id=10
-- где jsonUTF8 Nvarchar(max)
select jsonUTF8, * from tbl  where id=10

-- выдает тоже самое без искажения.
P.S. при попытке сохранить коммент со смайлами в code , перенесенные копипастой.
Выдает ошибку со сбитой кодировкой.
Похоже движок форума тоже не понимает смайлы.
заменил на смайл1 и смайл2
Аватара пользователя
Vapaamies
постоялец
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vapaamies »

jsa писал(а):Похоже движок форума тоже не понимает смайлы.
Угу. На предпросмотре показывает, а в базу не отправляет. То есть PHP уже поддерживает, а в MySQL нужно перейти на utf8mb4.
Ответить