символы Unicode (например, смайлики) в сообщении бота Telegram (или на клавиатуре)

1

Я играю с развитием ботов Telegram. Единственное, в чем я не добился успеха, - это отправить символы Юникода.

То, как я называю "sendMessage" api, находится в php с curl:

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array("chat_id" => $chat_id, "text" => "\u2b50"));

В приведенном выше коде должен быть размещен значок звездочки в чате, но вместо этого отображается точный текст:

\u2b50

  • Выход из текста ("\\ u2b50") не работает.
  • Если бот действует как эхо (отвечает полученным текстом) при вводе "\ u2b50" в клиенте, он отвечает звездочкой.
  • такое же поведение имеет для клавиш клавиатуры (reply_markup.keyboard)

заранее спасибо

EDIT: решено с решением от bobince (спасибо!).

используется встроенная функция:

$text = preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function ($match) {
    return iconv('UCS-4LE', 'UTF-8', pack('V', hexdec($match[1])));
}, $text);

или

$text = preg_replace("/\\\\u([0-9a-fA-F]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", $text);
Теги:
unicode
telegram-bot

2 ответа

3
Лучший ответ

"\ U2b50"

Синтаксис строкового литерала PHP не имеет \u экранов, в первую очередь потому, что строки PHP не основаны на Unicode, это всего лишь список байтов.

Следовательно, если вы хотите включить символ не ASCII в строку, вам нужно закодировать символ в байтах, используя любую кодировку, которую будет ожидать потребитель вашего вывода.

Если веб-служба Telegram ожидает получить UTF-8 (и я понятия не имею, если это так, но это хорошая догадка для любого современного веб-приложения), тогда байты с кодировкой UTF-8 для U + 2B50 равны 0xE2, 0xAD и 0x90, и поэтому строковый литерал, который вы должны использовать, это:

"\xE2\xAD\x90"

Если вы хотите конвертировать кодовое слово Unicode в строку UTF-8 более широко:

function unichr($i) {
    return iconv('UCS-4LE', 'UTF-8', pack('V', $i));
}

unichr(0x2B50)   // "\xE2\xAD\x90"
  • 0
    Теперь, как конвертировать символы Юникода, такие как \ ud83d \ udc4e (смайлик для большого пальца вниз). я нашел эту ветку (с вашим ответом) и перепробовал все комбинации, но безуспешно: stackoverflow.com/questions/2748956/…
  • 0
    0xd83d, 0xdc4e являются единицами суррогатного кода UTF-16, представляющими большие пальцы U + 1F44E, поэтому unichr(0x1F44E) , который дает байтовую строку UTF-8 "\xF0\x9F\x91\x8E" .
Показать ещё 3 комментария
0

установить кодировку в unicode...

$headers = array(
           "Content-Type: application/x-www-form-urlencoded; charset: UTF-8"
        );
curl_setopt($ch, CURLOPT_POST, $headers );
curl_setopt($ch, CURLOPT_HEADER, array("chat_id" => $chat_id, "text" => "\u2b50"));
  • 0
    нет способа использовать "application / x-www-form-urlencoded" ==> "400 (Bad Request)" с сервера. единственный принятый тип контента - «multipart / form-data», но не повезло с «Content-Type: multipart / form-data; кодировка: UTF-8», уже опробовано = (

Ещё вопросы

Сообщество Overcoder
Наверх
Меню