mirai-cpp】string的api出错,但旁边用来测试的都正常
-
一开始用的CString,写了好大一堆,一直出错我以为是CString的编码转换出了问题,然后这个”编码“一直搞不对了,我全删了单纯用string做,这次只写了一点点测试一下,结果一个substr都出问题,不报错的那种
服务器响应解析出错传不上图片了)
bot.On<GroupMessage>(
[](GroupMessage jieshou) {
string send = jieshou.MessageChain.GetPlainText();
string shuchu = "error";
if (send.substr(0, 4) == "名字") {
shuchu = "已识别";
在旁边的测试页可以正常运行(包括编码我都与这个一致了)
我让它直接回复 send没有出错,问题就在send.substr(0,4)==这里了
我读过好多遍详细文档了,水平太有限实在搞不定了是不是内部把string转成了别的东西,比如前后加了个引号之类的?这样我只要调一下字符串位置也就可以了(单纯由mirai-api-http的外表做的一点猜想)
-
@xiling 那里,,不是说水平不够读不懂详细文档,那个详细文档给的东西太少了,我的其他知识水平不够广
-
@xiling 好消息,它终于报错了!
0x00007FFCFC89D759 处(位于 RepeatMessage.exe 中)引发的异常: Microsoft C++ 异常: nlohmann::detail::type_error,位于内存位置 0x00000004DB5FC4A0 处。我是这样,
MessageChain msg=MessageChain().Plain(send.substr(0, 4));
jieshou.Reply(msg);
然后它终于报错的 -
在 On 函数里抛出异常是不会导致程序崩溃的,所以一定要在里面捕捉异常,否则会错过很多东西。
mirai-api-http 返回的数据都是 utf-8 编码的,如果你的 C++ 代码里有字符串字面量,那么你要保证你的源文件的编码也是 utf-8 编码的,才能用
if (send.substr(0, 4) == "名字")
这种判断。
还有就是 utf-8 编码下,中文一般占用 3 个字节,两个汉字你只取4个字节,等于第二个汉字只取了一部分,nlohmann遇到不正确的utf-8编码会报错。
我更建议你使用 正则表达式 或者 start_with。
如果你可以使用 C++20:
string msg_str = m.MessageChain.GetPlainTextFirst(); string_view msg_view(msg_str); if (!msg_view.starts_with("指令名称")) return;
或者用 string::find
string msg_str = m.MessageChain.GetPlainTextFirst(); if(msg_str.find("指令名称") != 0) return;
当然你的代码我没测试过,我只是猜测了下错误的原因,你可以去试试能不能解决。
-
@cyanray 3个字节。。。。我当时没想到这里有问题。。。。。。啊啊应该就是这了、哇谢谢——以前的废稿又能用了好耶
(utf-8我一开始就换编码了的。。。后来把cmd的编码也换成utf-8了qvq)