Windows C++ 模拟将表情符号输入到浏览器窗口 - 加扰字符

windows C++ simulating emoji input to a browser window - scrambled chars

提问人:Dirathyn 提问时间:10/11/2023 更新时间:10/11/2023 访问量:84

问:

我正在使用 Visual Studio Community 2022 构建一个 Windows C++ 应用程序,该应用程序尝试基本上使用一种或另一种方法将文本文件中的一行复制粘贴到 Chrome 浏览器的文本字段中。

我有一个 UTF-8 编码的 .txt 文件,每行包含一个句子,末尾有一个表情符号。

我正在尝试使用的示例表情符号: 🤭

我用这样的代码将其读入向量或向量中:(我尝试了 wstrings 和字符串)

    ifstream infile("Lines.txt");
    if(!infile.is_open()) return false;

    string aLine;
    // Read the database
    while (getline(infile, aLine))
    {
        theDB.push_back(aLine);
    }

    infile.close();

    return !theDB.empty();

然后我尝试将其发送 SendMessage(aWindow, WM_CHAR, aCharacter, 0);

并将其复制到剪贴板,然后从那里粘贴。(CF_TEXT和CF_UNICODETEXT格式,我已成功用于纯文本和西班牙语字母的方法。

我还尝试在编译器选项中添加 /utf8。

无论如何,表情符号总是被打乱,但在大多数设置中,文本的其余部分都可以正常工作。

C++ Windows Unicode UTF-8 表情符号

评论

2赞 Richard Critten 10/11/2023
Windows 需要 MBCS(代码页)或 UTF-16le 文本 - 取决于应用程序。
0赞 Remy Lebeau 10/11/2023
您是否阅读了WM_CHAR的文档?要发送表情符号(或 ASCII 以外的任何 Unicode 字符),您必须将其作为单独的 UTF-16 代理项(即 U+1F92D 发送),但前提是接收窗口是 Unicode 窗口。否则,请改用WM_UNICHAR0x2DDD 0xD83E
0赞 Dirathyn 10/11/2023
似乎如果我使用 wstrings 和 theDB.push_back(L“嘿🤭”);无需从文本文件加载 - 甚至可以WM_CHAR。由于某种原因,我什至无法编辑我的问题。
0赞 user20716902 10/11/2023
它会起作用,因为当您不使用文件时,表情符号不是 UTF-8 编码的。

答:

0赞 user20716902 10/11/2023 #1

您需要将 utf8 转换为 wchar,幸运的是 Windows 具有帮助您的功能,然后您可以使用 .MultiByteToWideCharCF_UNICODETEXT

这是我使用的功能。

wchar_t* utf8toWChar(const char* utf8string)
{
    const int buffsize = MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, nullptr, 0);

    wchar_t* gah = static_cast<wchar_t*>(malloc((buffsize + 1) * sizeof(wchar_t)));

    MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, gah, buffsize);
    gah[buffsize] = 0;

    return gah;
}

这是C++版本:

std::wstring utf8towstring(const std::string& utf8string)
{
   if (utf8string.empty())
   {
       return std::wstring();
   }

   int charactersWritten = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.data(), (int)utf8string.size(), NULL, 0);
   if (0 == charactersWritten)
   { 
       return std::wstring();
   }

   std::wstring str2;
   str2.resize(charactersWritten);

   charactersWritten = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.data(), (int)utf8string.size(), &str2[0], str2.capacity());
   if (0 == charactersWritten)
   {
      return std::wstring();
   }

   return str2;
}

读取 UTF-8 编码的文本文件,使用 utf8towstring 转换,然后复制到剪贴板:

输出:尝试使用:🤭那行得通!

评论

0赞 Remy Lebeau 10/11/2023
为什么要在 C++ 中使用?您只需预先分配一个并直接转换为它。或者,由于您知道该文件是 UTF-8,因此您可以改用 UTF-8 语言环境,然后将其行读入字符串。malloc()std::wstringstd::wifstreamimbue()std::wstring
0赞 user20716902 10/11/2023
我在发布之前尝试过您的建议,但无法使这种方法起作用,getline 似乎在第一次遇到表情符号时停止,但发布的答案有效并维护了表情符号。
0赞 Dirathyn 10/11/2023
这种方法即使WM_CHAR也适用于我。 谢谢!
0赞 Remy Lebeau 10/11/2023
@user20716902那么你可能只是没有正确使用它。无论如何,在更新的答案中,可以在 C++ 17 及更高版本中,并且应该是 .&str2[0]str2.data()str2.capacity()str2.size()