在 C++ 中将 LPCSTR 转换为 LPCWSTR,ATL 不可用

Converting LPCSTR to LPCWSTR in C++, ATL not available

在我开始之前,

请理解这个问题不是重复。那里有相同的问题 header :

将 LPCSTR 转换为 LPCWSTR

不过,我在问这个问题之前做了一些研究,发现了 ATLActive Template Library.

但是我使用的编译器没有附带 ATL,这不允许我从 LPCSTR 转换为 LPCWSTR

此外,为了理解为什么我需要转换这两种数据类型,原因是我正在处理一个项目,它实际上 是一个控制台游戏引擎。

如果您不知道,要重命名控制台 window,您需要使用 SetConsoleTitle(LPCWSTR winName)

起初,我使用 LPCWSTR 数据类型作为函数的参数。但是,当我尝试另一个函数(实际上是绘图函数)时,会发生以下情况:

您在此处看到的 UNICODE 个字符的组合是用于在控制台上绘制 矩形的函数。矩形正确显示,但是,有一些 text,或者我应该说 Console Title 本身,显示在矩形上。

我没有添加任何在矩形上显示控制台标题的东西,也没有以任何方式弄乱我的代码。我烧了几次我的代码,没有任何问题,但是,不知何故,控制台标题显示在矩形上。

我不知何故认为这与 LPCWSTR 数据类型有关,因为当我尝试该函数时,SetConsoleTitle() 手动

帮我想个办法好吗?

由于标题通常是不变的,您可以简单地调用

SetConsoleTitle(L"My Title"); //or
const wchar_t* title = L"My Title";
SetConsoleTitle(title);

一般情况下,使用MultiByteToWideChar将ANSI或UTF8转换为UTF16

#include <iostream>
#include <string>
#include <windows.h>

std::wstring u16(const char* in, int codepage)
{
    if (!in) return std::wstring(L"");
    int size = MultiByteToWideChar(codepage, 0, in, -1, NULL, 0);
    std::wstring ws(size, L'[=11=]');
    MultiByteToWideChar(codepage, 0, in, -1, ws.data(), size);
    return ws;
}

int main()
{
    const char* str = "My Title"; //<- ANSI string
    SetConsoleTitle(u16(str, CP_ACP).c_str());
    std::string s;
    std::cin >> s;

    str = reinterpret_cast<const char*>(u8"Ελληνικά"); //<- UTF8
    SetConsoleTitle(u16(str, CP_UTF8).c_str());
    std::cin >> s;

    return 0;
}

请注意,程序退出时标题会变回。