C++ 读取UTF-8文件,使用SendInput将内容传递给其他应用程序

C++ 读取UTF-8文件,使用SendInput将内容传递给其他应用程序,c++,winapi,unicode,C++,Winapi,Unicode,我有一个UTF-8格式化文件,其中包含一个字符“代码>代码< >代码>,当我在C++中使用IFFISH和CUT读取它时,输出是'┼»'。我可以通过添加“SetConsoleOutputCP(65001)”来解决这个问题,之后我使用“SendInput()”发送字符”转到另一个窗口。但是由于SetConsoleOutput()不影响SendInput(),应用程序将接收损坏的字符“┼»'。 问题是如何发送带有重音的字符 ifstream file(path); st

我有一个UTF-8格式化文件,其中包含一个字符“代码>代码< >代码>,当我在C++中使用IFFISH和CUT读取它时,输出是'<代码>┼»'。我可以通过添加“
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;