Как решить проблему с message.entities, offset, length и эмодзи в Telegram боте на Aiogram (Python)?

Есть самый простой фрагмент кода (Python + Aiogram):
@app.on_message(filters.chat(some_chat_id))
    async def test_reply(client, message):
        ent = [
            types.MessageEntity("text_mention", 0, len(message.from_user.first_name), user=message.from_user),
            types.MessageEntity("bold", len(message.from_user.first_name), 9)
        ]
        await message.reply(f'{message.from_user.first_name}, привет!', entities=ent)

Создаём свой text_mention (упоминание юзера в виде ссылки) для entities. Создаём жирный текст (или любой другой объект MessageEntity) с индексом начала, равному длине имени юзера и индексом конца, равному длине имени + длине жирного текста (в моём случае 9 символов). Отвечаем юзеру, используя наши entities.
Так это выглядит в Телеграм
645379783a942895637004.png


Но если имя юзера содержит некоторые эмодзи, то со сдвигом и длинной начинаются проблемы. Суть в том, что функция len() считает их за два символа, а Telegram - нет. Например, если добавить в имя смайл с кастомным цветом, у нас сдвинется entity: буква Т и восклицательный знак уже не попадут в форматирование жирным текстом, снизу прикрепил пример.
Пример кривой работы
64537b7376ce6573480353.png


Почему это так работает, как бороться с кривым смещением? Может быть это связано с кодировками (код в UTF-8)?
Нужна только такая связка, с использованием message.entities
  • Вопрос задан
  • 231 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы