提问人:Dirathyn 提问时间:10/11/2023 更新时间:10/11/2023 访问量:84
Windows C++ 模拟将表情符号输入到浏览器窗口 - 加扰字符
windows C++ simulating emoji input to a browser window - scrambled chars
问:
我正在使用 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。
无论如何,表情符号总是被打乱,但在大多数设置中,文本的其余部分都可以正常工作。
答:
0赞
user20716902
10/11/2023
#1
您需要将 utf8 转换为 wchar,幸运的是 Windows 具有帮助您的功能,然后您可以使用 .MultiByteToWideChar
CF_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::wstring
std::wifstream
imbue()
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()
评论
WM_CHAR
的文档?要发送表情符号(或 ASCII 以外的任何 Unicode 字符),您必须将其作为单独的 UTF-16 代理项(即 U+1F92D 发送),但前提是接收窗口是 Unicode 窗口。否则,请改用WM_UNICHAR
。0x2DDD 0xD83E