我正在玩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"));