关于qt执行带有中文参数的DOS命令执行不成功
如题,关于qt执行带有中文参数的DOS命令执行不成功
我有一个梦想,我写的代码,可以像诗一样优美。我有一个梦想,我做的设计,能恰到好处,既不过度,也无不足。
项目中第一款软件交付遇到一个小细节,作为开发,我们一般都默认避免中文路径,但是客户不一样,他们的习惯是中文!中文!还TMD是中文!
环境:qt5.9 + MSVC2015_64
数据库中有个数据表,每次初始化数据库的时候用到,跟用户说明了不要放在中文路径下,但是作为甲方,怎么能听你的,他连你的软件使用手册都不看的好吗!
必须放在中文路径下,虽然我不会手动用到它,但它必须得在中文目录下!
阿西吧!本着用户是上帝的原则,开始了一波改动。
先从中文路径说起,在不进行其他文件格式的变动的情况下(比如将文件由utf8转成asicll之类的情况下),由QFileDialog获取的路径是正常的,但是如果手动构造一个字符串 D:/360安全浏览器下载/source/TESTDATA.sql,就会出现如下情况
从输出来看(调试的窗口就懒得截图了),可以看的出来中文字符应该是解析了的,但是最后一个字符“载”解析出错,查阅无果,试了下在不使用MSVC的情况下,只使用MINGW32,就不会出现这个问题,说明问题还是在MSVC的身上。
之前查到一篇博客说,VS把文件格式还是字符集什么东东改成了utf8不带bom头的啥玩意(原谅我忘了,这个东西了解下就好),造成了和qt不一致的原因,行,那就不要手动构造了。
用QFileDialog获取的带有中文路径的字符串,转成char*
附注:import_file为带有中文路径的字符串。
执行发现,并没有成功。
写个demo 重新试一遍(一定要把它弄清!)
QString strCMd = "mysql -uroot -p10220 -h127.0.0.1 testta415 < D:\\360安全浏览器下载\\source\\testdata.sql";////// \brief strstd::string cmd = strCMd.toStdString();const char* ccmd = cmd.c_str();
为了方便我直接手动构造了可以识别的中文字符串
调试发现:
转换成的char* ccmd字符串是正确的的,但是调用systerm()就不成功。
在查看std::string的结构的时候,突然想起来还有个std::wstring!
我去,这上学那会儿用到的,这两年还真没用到过几次宽字节,虽然还没有试,但是直觉告诉我,就是他了,问题就在这里。
#include <Windows.h>
char * wchar2char(const wchar_t* wchar )
{char * m_char;int len= WideCharToMultiByte( CP_ACP ,0,wchar ,wcslen( wchar ), NULL,0, NULL ,NULL );m_char= new char[len+1];WideCharToMultiByte( CP_ACP ,0,wchar ,wcslen( wchar ),m_char,len, NULL ,NULL );m_char[len]= '\0';return m_char;
}
上述代码为宽字节转为char*。
QString strCMd = "mysql -uroot -p10220 -h127.0.0.1 testta415 < D:\\360安全浏览器下载\\source\\testdata.sql";////// \brief strstd::string cmd = strCMd.toStdString();const char* ccmd = cmd.c_str();//为了对比的没有删除std::wstring strtest = strCMd.toStdWString();const wchar_t * str = strtest.c_str();const char* pstr = wchar2char(str);system(pstr);
本着求真的心态,再次调试,会发现不一样的东西
在转化为wstring和wchar的时候,字符都是正常的,当转到char的时候,又会成为乱码,不用担心,如果没有变化,那才要担心,有改变说明才说明可能有戏。
接着执行下去!
成功了!
记录一下,免得以后忘掉,也给别的遇到这个问题的小伙伴提个醒。
写在最后,C++之路长漫漫,你我当薪火相传。
关于qt执行带有中文参数的DOS命令执行不成功相关推荐
- 【Ubuntu16.04】解决Qt安装包(.run文件)不能用./命令执行的问题
[Ubuntu16.04]解决Qt安装包(.run文件)不能用./命令执行的问题 参考文章: (1)[Ubuntu16.04]解决Qt安装包(.run文件)不能用./命令执行的问题 (2)https: ...
- Hack The Box - Meta 利用Exiftool远程代码执行漏洞获取webshell,ImageMagrick命令执行漏洞横向提权,更改环境配置SUDO纵向提权
Hack The Box - Meta Hack The Box开始使用流程看这篇 文章目录 Hack The Box - Meta 整体思路 1.Nmap扫描 2.Exiftool远程代码执行漏洞( ...
- PHP exec xargs 不执行,关于 ‘--exec’ 参数( find 命令)及介绍 ‘xargs ’命令区别(新版)...
###前言: find 命令一直都是系统管理员的常用命令之一, 其参数中 "-exec" 尤其实用.而 "xargs" 命令,针对查询也有属于自己的见解.本文着 ...
- 在C#里,如何执行cmd里的常用dos命令 (转)
http://blogger.org.cn/blog/more.asp?name=nrzj&id=4280 using System; using System.Diagnostics; na ...
- runtime无法执行grep_让你的 Shell 命令执行可视化和告警
Sampler是一个用于shell命令执行,可视化和告警的工具.其配置使用的是一个简单的YAML文件. 1.为什么我需要它? 你可以直接从终端对任意动态进程进行采样 – 观察数据库中的更改,监控MQ动 ...
- 【漏洞学习——命令执行】中国民生银行某站命令执行漏洞Getshell
漏洞细节 http://58.68.130.68/wis18/customerjsp/msyh/login/login.jsp 命令执行漏洞 shell http://58.68.130.68/wis ...
- linux如何执行python文件_以linux命令执行Python文件 - python
Closed. This question needs to be more focused.它当前不接受答案. 想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题 ...
- oracle执行带有nbsp参数,Oracleamp;nbsp;参数文件amp;nbsp;spfileamp;nbsp;a
一.pfile spfile区别 Pfile 文本,可以被vi编辑 viinitsid.ora Spfile 二进制 只能放在Oracle服务器端 spfilesid.ora Spfile 可以被rm ...
- execjs执行包含中文参数的JavaScript
抓取到了一段包含数据的JavaScript代码: import re import requestsheaders = {"user-agent": "Mozilla/5 ...
最新文章
- xcode7 没有Empty Application
- Scala 数组详解
- PHP获取文件的绝对路径
- 开始体验Kali Linux
- 一、WPF 2个datagrid之间同步进度条
- Linux fork的写时复制
- Java集合框架使用总结
- 【二分图匹配】E. 过山车
- mysql字段里面有16字节特殊字符替换
- 罗马盘,大力盘,大圣盘等网盘资源搜索免费下载资源教程
- linux下wav转换为mp3
- rba有哪几個主要組成部分_RBA管理体系有哪些
- background_dump_dest 参数
- aptx与ldac音质区别_ldac_aptx和aptx hd功能介绍及区别介绍
- 通过Python爬虫按关键词抓取相关的新闻
- SQL查询重复记录 sql 查重
- H3C交换机配置DHCP
- python 长整型_Python变量类型(l整型,长整形,浮点型,复数,列表,元组,字典)学习...
- 哪里能免费下载动态PPT模板?高端精美动态PPT模板大全免费
- Matlab:plot函数绘制二维折线图