异想天开

What's the true meaning of light, Could you tell me why

Qt中使用curl带中文路径上传文件失败问题

日期:2020-02-25 22:11:49
  
最后更新日期:2020-02-26 16:27:12
这次又遇到了由中文引起的问题,不过不是乱码,而是curl库用form去上传文件时异常。返回的错误码提示读取文件失败,换英文路径就ok,于是推测是中文路径引起的。程序启动的时候设置了跟系统一样的locale,在main函数加两句下面的代码即可设置并查看locale。
[code lang="cpp"]
char *p = setlocale(LC_ALL,"");
LOG4CPLUS_DEBUG(logger, "Entering loop locale " << p);
[/code]
显示代码页为936,为gb2312。于是将qt控件返回的utf8先转为wchar_t的unicode,然后转为本地多字节。这里可以直接将二进制用字符串的形式打印出来,查看二进制。然后在c语言里面或python代码,用printf输出二进制到控制台,看是否为正确的汉字。
验证了确实转为gb2312的字节,但是传给curl函数,还是上传失败。后面干脆直接将gb2312二进制输入给curl函数,上传成功了。说明curl函数对跟系统一致的代码页的编码是识别的。于是问题就出在转化。发现,只在一个地方可能有问题,那就是将gb2312的多字节传给Qt里面的QString,然后从QString里面取c_str给curl函数。gb2312的多字节缓存构造QString对象,这里中间经过了一层转换,QString会把它当utf8理解,理解不了时就会在里面加点东西,导致出来的c_str已经不是gb2312了,而是乱码。解决的办法也简单,就是不用QString,直接用const char*,解决。