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

时间:2015-07-07 20:59:58

标签: php unicode telegram-bot

我正在玩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”时,机器人充当回声(回复收到的文本),则会回复星号图标。
  • 键盘键(reply_markup.keyboard)
  • 的行为相同

提前致谢

编辑: 解决了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);

2 个答案:

答案 0 :(得分:3)

  

“\ u2b50”

PHP string literal语法没有\u转义,主要是因为PHP字符串不是基于Unicode的,它们只是一个字节列表。

因此,如果要在字符串中包含非ASCII字符,则需要使用输出的使用者期望的任何编码将字符编码为字节。

如果Telegram网络服务期望收到UTF-8(我不知道是不是,但对任何现代网络应用程序都是一个好猜测),那么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"

答案 1 :(得分:0)

将charset设置为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"));