字符* 到常量 wchar_t * 转换

char* to const wchar_t * conversion

本文关键字:转换 常量 字符 wchar      更新时间:2023-10-16

我需要将字符指针转换为w_char *才能使用ParseNetworkString()。我尝试自己寻找解决方案,虽然我找到了一个解决方案,但有一个问题阻止我使用它:

b1naryatr0phy在另一篇文章中说:

std::wstring name( L"Steve Nash" );
const wchar_t* szName = name.c_str();

这几乎对我有用,除了我不能只传递字符串 explicity,因为它的值并不总是相同的,这意味着我不能只把它放在引号中。如果我用函数调用替换参数,那么第一行会给我一个错误(例如:std::wstring name(LgetIpAddress());我尝试过 std::wstring name(L" " + getIpAddress() + " "); ,认为它只需要在 L 后面加上引号,但这也不起作用。有什么建议吗?

谢谢! :)

对能回答这个问题的人加倍赞!

链接到其他帖子: 我想将 std::string 转换为常量 wchar_t *

P.S. 抱歉,只是为了澄清,getIpAddress 返回一个字符指针

getIpAddress()的类型是什么?

下面是一个片段,展示了如何将string转换为wstring(使用标准 C++11,无错误检查):

wstring to_wstring(string const& str)
{
  size_t len = mbstowcs(nullptr, &str[0], 0);
  if (len == -1) // invalid source str, throw
  wstring wstr(len, 0);
  mbstowcs(&wstr[0], &str[0], wstr.size());
  return wstr;
}

你只看了另一个答案的一部分。它继续解释您需要执行MultiByteToWideChar才能从 8 位字符串转换为 16 位字符串。

这假设wchar_t在你的平台上使用 UTF-16(我假设是 Windows,从你提到的 ParseNetworkString())。它还假定 char* 使用 UTF-8 而不是传统编码,因为您确实不应该使用传统编码,即使在 Windows 上也是如此。

#include <codecvt>
int main() {
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t> convert;
    std::wstring name = convert.from_bytes("Steve Nash");
    const wchar_t* szName = name.c_str();
}

如果您使用的是旧编码,那么您应该通过完全迁移到wchar_t API(假设您不关心可移植代码)或使用 UTF-8 作为内部 char* 编码来解决此问题。如果您坚持使用旧编码,则需要使用处理转换它们的函数之一,例如mbstowcs()(它是区域设置敏感的,这会带来一大堆新问题),或者使用MultiByteToWideChar()有一些类似的问题,但与 Windows 区域设置的网格更好。