在 C++ 中将 LPCSTR 转换为 LPCWSTR,ATL 不可用
Converting LPCSTR to LPCWSTR in C++, ATL not available
在我开始之前,
请理解这个问题不是重复。那里有相同的问题 header :
将 LPCSTR 转换为 LPCWSTR
不过,我在问这个问题之前做了一些研究,发现了 ATL 或 Active 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;
}
请注意,程序退出时标题会变回。
在我开始之前,
请理解这个问题不是重复。那里有相同的问题 header :
将 LPCSTR 转换为 LPCWSTR
不过,我在问这个问题之前做了一些研究,发现了 ATL 或 Active 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;
}
请注意,程序退出时标题会变回。