为什么在通过 Telegram 机器人以阿拉伯语发布消息时 urlencode 不起作用?

Why is urlencode not working when posting message in Arabic via Telegram bot?

$message 从 mysql db

中检索

数据库表有 utf8_general_ci 作为字符编码

每个连接都会执行以下操作:

mysqli_query($this->link,"set character set utf-8");

php 文件编码为 utf-8

$message=urlencode($message);

当使用以下命令时:

echo $response = file_get_contents
("https://api.telegram.org/botxxxxxxxxxxxxxx/sendMessage?chat_id=-100xxxxxxx&disable_web_page_preview=TRUE&parse_mode=markdown&text=". $message);
}

如果检索到的 $message 以英语存储:它有效

如果 $message 以阿拉伯语存储:它不会工作

如果 $message 在文件本身中以阿拉伯语输入(不是从数据库中检索):它有效

怎么了?非常感谢您的帮助!

您需要使用 phpMyadmin 手动配置 MySQL 数据库字符集 将其设置为“utf8” 或者在打开连接时以编程方式尝试此代码:

$dbcon = mysqli_connect("host","user","pass","db"); 
    mysqli_query($dbcon, "set character_set_server='utf8'");        
    mysqli_query($dbcon, "set names 'utf8'");   

您可能需要检查数据库表中的消息并且可能需要 如果由于错误的字符集而导致格式错误,请再次将您的消息重新输入到数据库中。

看起来原因是浏览器仍然将 $message 视为“WINDOWS-256”编码。其他所有内容都是 UTF8 编码的!

所以 iconv 解决了这个问题。

$message=urlencode($message);

应该是:

$message=urlencode(iconv("WINDOWS-256", "UTF-8", $message));

我真的不知道为什么,但它成功了!