C++ 为什么我的unicode字符串处理(打印/复制)不正确?

C++ 为什么我的unicode字符串处理(打印/复制)不正确?,c++,unicode,utf-8,escaping,C++,Unicode,Utf 8,Escaping,我正在尝试制作一个可以处理unicode字符串的程序,最终能够将它们复制到Windows剪贴板 我从一个简单的cout测试程序开始: #include <iostream> int main() { std::cout << "( ͡° ͜ʖ ͡°)\n"; return 0; } 我有一种感觉,问题是代码文件甚至没有使用unicode字符保存,因此我决定使用以下转义序列来表示它们: 注: 我正在Windows10上开发这个程序。 在我的系统上,Win

我正在尝试制作一个可以处理unicode字符串的程序,最终能够将它们复制到Windows剪贴板

我从一个简单的cout测试程序开始:

#include <iostream>

int main()
{
    std::cout << "( ͡° ͜ʖ ͡°)\n";
    return 0;
}
我有一种感觉,问题是代码文件甚至没有使用unicode字符保存,因此我决定使用以下转义序列来表示它们:

注:

我正在Windows10上开发这个程序。 在我的系统上,Windows控制台上的conhost.exe可以处理有问题的unicode字符串。 我将代码::块与MinGW编译器一起使用。 使用CF_unicodext,而不仅仅是CF_文本。此外,您应该声明带有L前缀的unicode字符串,例如L


除答案外,请参见此below@BarmakShemirani该链接对我没有帮助,我使用的是代码块而不是Visual Studio,该答案中提供的用于打印unicode的代码不会为我编译。然后问另一个问题,并提及代码块/MinGW。你在这里问了两个问题。复制应该和MingGW一起工作,但是打印unicode是不同的。顺便说一句,这可能不可能做到。我刚刚用VisualStudio试过,它做得不完全正确我建议的解决方案并不总是有效。我使用了WriteConsoleW和CodeBlock,它没有像我预期的那样工作。控制台窗口对Unicode的支持有限。@BarmakShemirani我最初试图打印它,所以在程序运行后不必继续粘贴。
( ͡° ͜ʖ ͡°)
#include <iostream>

using namespace std;

int main()
{
    std::cout << "( \u0361\u00b0 \u035c\u0296 \u0361\u00b0)\n";
    return 0;
}
#include <string>
#include <windows.h>

void clip(std::string input);

int main()
{
    clip("( ͡° ͜ʖ ͡°)");
    return 0;
}

void clip(std::string input)
{
    HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, strlen(input.c_str()) + 1);

    memcpy(GlobalLock(hMem), input.c_str(), strlen(input.c_str()) + 1);
    GlobalUnlock(hMem);
    OpenClipboard(0);
    EmptyClipboard();
    SetClipboardData(CF_TEXT, hMem);
    CloseClipboard();
}
#include <Windows.h>
#include <cstring>
#include <string>

int main() {
    std::wstring str(L"( ͡° ͜ʖ ͡°)");
    if (OpenClipboard(HWND_DESKTOP)) {
        EmptyClipboard();
        auto sz = (str.size() + 1) * sizeof(str[0]);
        auto hMem = GlobalAlloc(GMEM_MOVEABLE, sz);
        if (hMem != nullptr) {
            auto pMem = GlobalLock(hMem);
            memcpy(pMem, str.c_str(), sz);
            GlobalUnlock(hMem);
            SetClipboardData(CF_UNICODETEXT, hMem);
        }
        else {
            fprintf(stderr, "Can't allocate memory");
        }
        CloseClipboard();
    }
    else {
        fprintf(stderr, "Can't open clipboard");
    }
    return 0;
}