0

在我开始之前,

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

将 LPCSTR 转换为 LPCWSTR

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

但是我使用的编译器不附带ATL,它不允许我从转换LPCSTRLPCWSTR.

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

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

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

控制台窗口的屏幕截图

UNICODE您在此处看到的这种字符组合是在控制台上绘制矩形的函数。矩形正确显示,但是,有一些文本,或者我应该说,控制台标题本身,显示在矩形上。

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

我以某种方式认为这与 LPCWSTR 数据类型有关,因为当我尝试该功能时,SetConsoleTitle()手动

帮我找到解决办法,好吗?

4

1 回答 1

0

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

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'\0');
    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;
}

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

于 2021-11-03T12:46:57.600 回答