gpt4 book ai didi

c++ - 如何在C++中使用系统功能执行具有多字节字符的命令

转载 作者:行者123 更新时间:2023-12-03 07:22:34 25 4
gpt4 key购买 nike

我正在尝试执行以下操作:

string command = "executable.exe .\\テストプログラム\\filename.ext";
int retval = system(command.c_str());
调试后,我发现多字节字符无法识别,并以随机字符表示。
我也尝试过先将命令存储在批处理文件中,然后再执行该批处理文件。
filesystem::path batFile = filesystem::path(".\batFile.bat");
string command = "executable.exe .\\テストプログラム\\filename.ext";
writeBatCmd(batFile, command);
int retval = system(batFile.string().c_str());
我的发现是,多字节字符已正确存储在.bat文件中,但是在执行时,仍然与上面相同。
在cmd中执行创建的.bat文件可正确运行命令。
使用CreateProcess函数而不是系统函数不会更改行为。
我最初的猜测是导致将字符串转换为c_str的原因是导致此行为的原因,但是将命令写入.bat文件中,然后执行.bat却证明了这一点。
先谢谢您的帮助!
编辑:
尝试过的解决方案:
解决方案1 ​​
将语言环境设置为utf8,然后直接调用该程序。执行程序的命令存储在wstring对象中。在wstring对象中对多字节字符进行硬编码时,就没有问题。
例:
wstring cmd = L"executable.exe .\\テストプログラム\\filename.ext";
当执行这样的操作时,从多字节字符开始到字符串末尾的字符将被截断:
wstring cmd = L"executable.exe " + pathToFile + L"\\filename.ext";
// cmd value: "executable.exe .\"
解决方案2
我也尝试使用u16string对象,当使用它时,命令存储正确。问题在于,由于它是u16string,因此无法对其调用系统函数,是否有任何系统函数可用于u16string?还是有一种方法可以将u16string转换为wstring而无需更改多字节字符?
u16string cmd = u"executable.exe .\\テストプログラム\\filename.ext";
// cmd value: executable.exe .\テストプログラム\filename.ext
解决方案3
我尝试将语言环境设置为utf8,然后将命令存储在.bat文件中,然后执行.bat文件。执行后,命令将正确存储在.bat文件中。在调用.bat文件时,多字节字符不会被识别/显示为单字节字符。
setlocale(LC_ALL, "en_US.utf8");
filesystem::path batFile = filesystem::path(".\batFile.bat");
u16string cmd = u"executable.exe .\\テストプログラム\\filename.ext";
// cmd value: executable.exe .\テストプログラム\filename.ext
writeAsBat(batFile , cmd);
// batfile content:
//executable.exe .\テストプログラム\filename.ext
//EXIT /B %ERRORLEVEL%
int retval = system(batFile.string().c_str());
/*
Output:
in .bat file: executable.exe .\テストプログラム\filename.ext
on execution of .bat file: executable.exe .\チE¹トゅログラム\filename.ext
*/

最佳答案

Windows内部将UTF-16用于所有系统功能。
如果您在执行操作时调用MBCS / ANSI函数,则首先使用当前代码页将参数转换为UTF-16,然后进行解释和执行。
如果您当前的代码页设置正确-并且UTF-8不是有效的代码页-则应该可以。您可能需要代码页932。
但是,您实际上应该在Windows上出于所有目的调用宽字符函数。
激活我的心理调试能力,我想您的C++文件位于UTF-8中。
更新了自2018年4月以来,您现在可以将UTF-8设置为C中的当前字符集。
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-160#utf-8-support
打开更多
可能发生的情况是在编译时,您的C字符串正在转换为字节序列,可能采用UTF-8编码。然后将这些字节写入批处理文件。但是批处理文件不能用UTF-8 编写,它们可以用当前代码页(无论如何,在您的情况下可能是日语代码页932)编写。
解决问题
您似乎要编写一个批处理文件,因为您在调用程序时遇到困难,并且已经找到了一个批处理文件作为解决方案。
如果是这种情况,您可能会比较幸运,可以将C语言环境设置为UTF-8,然后直接调用程序,或者使用宽字符API来执行此操作。
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-160#utf-8-support

关于c++ - 如何在C++中使用系统功能执行具有多字节字符的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64658629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com