电报机器人消息(或键盘)中的Unicode字符(如表情符号)


unicode characters (like emoticons) in telegram bot message (or keyboard)

我正在玩Telegram bot开发。我唯一没有成功的是发送unicode字符。

我调用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"时,如果bot作为echo(回复接收到的文本),它会以星形图标回复。
  • 与键盘键相同的行为(reply_markup.keyboard)

Thanks in advance

编辑:用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 web服务期望接收UTF-8(我不知道它是否存在,但对于任何现代web应用程序来说,这是一个很好的猜测),那么U+2B50的UTF-8编码字节是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"));