1

我正在玩 Telegram 机器人开发。我唯一没有成功的是发送 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);
4

2 回答 2

3

"\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"
于 2015-07-08T07:55:38.813 回答
0

将字符集设置为 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"));
于 2015-07-07T21:04:00.877 回答