【问题标题】:unicode characters (like emoticons) in telegram bot message (or keyboard)电报机器人消息(或键盘)中的 unicode 字符(如表情符号)
【发布时间】:2015-07-07 20:59:57
【问题描述】:

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

【问题讨论】:

    标签: php unicode telegram-bot


    【解决方案1】:

    "\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"
    

    【讨论】:

    • 现在,如何转换 unicode 字符,如“\ud83d\udc4e”(拇指向下的表情符号)。我找到了这个线程(有你的回复)并尝试了所有组合,但没有成功:stackoverflow.com/questions/2748956/…
    • 0xd83d, 0xdc4e 是 UTF-16 代理代码单元,代表 U+1F44E Thumbs Down,所以 unichr(0x1F44E),它给出了 UTF-8 字节字符串 "\xF0\x9F\x91\x8E"
    • 我印象深刻,但我不明白如何将 (0xd83d, 0xdc4e) 转换为 0x1F44E...这篇文章:stackoverflow.com/a/24763655/5091220 有我可以使用的功能。谢谢
    • 接受的答案是正确的,但请确保将代码放在双引号之间,而不是单引号之间! (我没有足够的声誉发表评论,我认为这很重要” ` $rocket .= "\xF0\x9F\x9A\x80"; //works $rocket .= '\xF0\x9F\x9A\x80' ; // 不起作用`
    【解决方案2】:

    将字符集设置为 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"));
    

    【讨论】:

    • 无法从服务器使用“application/x-www-form-urlencoded”==>“400(错误请求)”。唯一接受的内容类型是“multipart/form-data”,但“Content-Type: multipart/form-data; charset: UTF-8”没有运气,已经尝试过 =(
    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 2020-12-15
    • 2018-03-23
    • 2016-03-22
    • 2016-04-28
    • 2021-10-12
    • 1970-01-01
    • 2020-10-08
    相关资源
    最近更新 更多