我正在玩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
提前致谢
编辑: 解决了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);
答案 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"));