Я играю с развитием ботов Telegram. Единственное, в чем я не добился успеха, - это отправить символы Юникода.
То, как я называю "sendMessage" api, находится в php с curl:
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array("chat_id" => $chat_id, "text" => "\u2b50"));
В приведенном выше коде должен быть размещен значок звездочки в чате, но вместо этого отображается точный текст:
\u2b50
заранее спасибо
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);
"\ 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"
установить кодировку в 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"));
unichr(0x1F44E)
, который дает байтовую строку UTF-8"\xF0\x9F\x91\x8E"
.