C ++获取剪贴板 - 特殊字符

时间:2015-07-13 07:31:32

标签: c++ unicode

我有一个简单的函数,用于从剪贴板检索文本并将其打印到文件。除非外部字母在剪贴板中,否则它工作正常。例如,字母“ń”将不会被打印出来。这是代码,省略了一些明显的部分:

HANDLE hData = GetClipboardData(CF_UNICODETEXT);
if (hData != NULL)
{
    wchar_t * pszText = static_cast<wchar_t*>(GlobalLock(hData));
    if (pszText != NULL)
    {
        std::wstring text(pszText);

        // Release the lock
        GlobalUnlock(hData);

        // Release the clipboard
        CloseClipboard();

        //myFile is a wofstream.
        myFile << text;
    }
}

我尝试了什么:

  1. 我使用“wcout”以及标准“cout”来打印变量“text”和“pszText”。在这两种情况下,特殊字母都没有打印出来。
  2. 尝试将CF_UNICODETEXT更改为CF_TEXT,结果相同。
  3. TL:DR我有一个获取剪贴板功能,但它不适用于“ń”或“ć”等字符。

    编辑:根据建议,我检查了调试器中的变量。事实证明,变量“wstring text”实际上包含特殊字符,例如“N”。问题似乎是写入文件。在编写特殊字符之前是否需要打开一些特殊的文件?以下是我打开文件的方式。

    myFile.open(logFullPath, std::ios_base::out | std::ios_base::app);
    

    EDIT2: 我现在100%肯定是问题就在这一行:

    //myFile is a wofstream.
    myFile << text;
    

1 个答案:

答案 0 :(得分:0)

以下代码是如何处理将unicode字符写入ofstream的上述问题的示例。到目前为止,使用它解决了我的所有问题。

#include <fstream>
#include <codecvt>

int main() {
    std::wofstream mystream("test.txt");
    mystream.imbue(std::locale(std::locale(),
                   new std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::codecvt_mode(std::consume_header|std::generate_header)>));
    mystream << "Hello, World!\n";
}