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

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

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

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

Сообщение jsa » 21.02.2024 08:08:38

Добрый день.

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

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

Кто-нибудь знает как решать такую задачу?
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

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

Сообщение xchgeaxeax » 21.02.2024 09:11:06

Для начала потрудитесь изучить различия 1251 и UTF-8. У 1251 всего 256 символов и все заняты знаками. Где вы собрались хранить смайлы. Проще в базе данных поменять кодировку сохранения текста.
xchgeaxeax
постоялец
 
Сообщения: 125
Зарегистрирован: 11.05.2023 03:51:40

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

Сообщение jsa » 21.02.2024 09:35:32

xchgeaxeax писал(а):Проще в базе данных поменять кодировку сохранения текста.

Это один вариант.
а второй, как то сделать представление в виде кодов
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

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

Сообщение xchgeaxeax » 21.02.2024 09:56:56

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

Добавлено спустя 5 минут 26 секунд:
Как вы себе представляете сокращение количества знаков с более чем 1 миллиона (для UTF-8) до 256 (для 1251) без каких-либо ухищрений и соответствующее обратное преобразование.
xchgeaxeax
постоялец
 
Сообщения: 125
Зарегистрирован: 11.05.2023 03:51:40

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

Сообщение stikriz11 » 21.02.2024 10:13:32

jsa писал(а):Это один вариант

Это правильный вариант. Не один, а единственный. Все остальное - костыли и грабли.
stikriz11
постоялец
 
Сообщения: 126
Зарегистрирован: 04.09.2023 15:54:19

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

Сообщение xchgeaxeax » 21.02.2024 12:07:17

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

Но это просто костыли. Проще действительно изменить формат поля для сохранения текста в базе данных.
xchgeaxeax
постоялец
 
Сообщения: 125
Зарегистрирован: 11.05.2023 03:51:40

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

Сообщение jsa » 21.02.2024 12:48:05

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
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

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

Сообщение Vapaamies » 27.02.2024 11:29:33

jsa писал(а):Похоже движок форума тоже не понимает смайлы.

Угу. На предпросмотре показывает, а в базу не отправляет. То есть PHP уже поддерживает, а в MySQL нужно перейти на utf8mb4.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

Рейтинг@Mail.ru