C++ 读取UTF-8文件,使用SendInput将内容传递给其他应用程序
我有一个UTF-8格式化文件,其中包含一个字符“代码>代码< >代码>,当我在C++中使用IFFISH和CUT读取它时,输出是'<代码>┼»'。我可以通过添加“C++ 读取UTF-8文件,使用SendInput将内容传递给其他应用程序,c++,winapi,unicode,C++,Winapi,Unicode,我有一个UTF-8格式化文件,其中包含一个字符“代码>代码< >代码>,当我在C++中使用IFFISH和CUT读取它时,输出是'┼»'。我可以通过添加“SetConsoleOutputCP(65001)”来解决这个问题,之后我使用“SendInput()”发送字符”转到另一个窗口。但是由于SetConsoleOutput()不影响SendInput(),应用程序将接收损坏的字符“┼»'。 问题是如何发送带有重音的字符 ifstream file(path); st
SetConsoleOutputCP(65001)”来解决这个问题代码>,之后我使用“SendInput()”发送字符“代码>”转到另一个窗口。但是由于SetConsoleOutput()不影响SendInput(),应用程序将接收损坏的字符“┼»
'。
问题是如何发送带有重音的字符
ifstream file(path);
string str;
while (getline (file, str))
{
cout << endl << str <<endl;
for (char &c : str) {
INPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0;
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
ip.ki.dwFlags = KEYEVENTF_UNICODE;
if (isupper(c)) {
ip.ki.wVk = VK_LSHIFT;
SendInput(1, &ip, sizeof(INPUT));
} else {
ip.ki.dwFlags = KEYEVENTF_KEYUP;
ip.ki.wVk = VK_LSHIFT;
SendInput(1, &ip, sizeof(INPUT));
ip.ki.dwFlags = KEYEVENTF_UNICODE;
}
ip.ki.wVk = VkKeyScanA(c);
SendInput(1, &ip, sizeof(INPUT));
Sleep(100);
}
INPUT enter;
enter.type = INPUT_KEYBOARD;
enter.ki.wScan = 0;
enter.ki.time = 0;
enter.ki.dwExtraInfo = 0;
enter.ki.dwFlags = 0;
enter.ki.wVk = VK_RETURN;
SendInput(1, &enter, sizeof(INPUT));
cout << "enter pressed";
}
ifstream文件(路径);
字符串str;
while(getline(文件,str))
{
库特
UTF-8和Windows不是好朋友。几乎所有使用Windows的操作都需要UTF-16。您需要将UTF-8字符串转换为UTF-16。在Windows上,这将是“wstring”但是,你应该使用正确的转换程序。唉,C++标准现在不必麻烦给你一个工作11,所以Windows特定的代码> MulyBytEoWordIsChar < /C>看起来是个不错的选择。
这样不行
如果dwFlags成员指定KEYEVENTF_UNICODE,则wVk必须为0
Unicode字符不能与Shift或其他修饰符组合。它们不是键代码,而是字符。A
和A
是不同的字符,不需要按Shift键来区分它们。您也不需要VkKeyScanA
,因为您希望发送Unicode字符,而不是扫描cod是的
您需要首先将UTF-8数据转换为UTF-16,例如使用MultiByteToWideChar()
或等效工具,然后可以使用KEYEVENTF\u UNICODE
标志将各个UTF-16代码单元传递到SendInput()
。有关使用SendInput()发送UTF-16字符串的示例,请参阅至
评论不适用于长时间的讨论;此对话一直是。效果非常好!
ip.ki.dwFlags = KEYEVENTF_UNICODE;
if (isupper(c)) {
ip.ki.wVk = VK_LSHIFT;