【问题标题】:char* to const wchar_t * conversionchar* 到 const wchar_t * 的转换
【发布时间】:2012-08-04 21:29:29
【问题描述】:

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

b1naryatr0phy 在另一篇文章中说:

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

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

谢谢! :)

感谢能回答这个问题的人!

链接到其他帖子:I want to convert std::string into a const wchar_t *

附:抱歉,澄清一下,getIpAddress 返回一个字符指针

【问题讨论】:

  • 如果 getIpAddress() 返回 wstring 或 wchar_t* 那么你只需要在 getIpAddress() 之前删除 L

标签: c++ pointers char wchar


【解决方案1】:

您只查看了其他答案的一部分。它继续解释您需要执行 MultiByteToWideChar 以将 8 位字符串转换为 16 位字符串。

【讨论】:

    【解决方案2】:

    getIpAddress()的类型是什么?

    这是一个 sn-p,展示了如何将 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;
    }
    

    【讨论】:

    • 据我所知,c++ 标准不同意 std::string 和 std::wstring 元素排列在连续的内存块中。因此,最好将 std::wstring 替换为 std::vector 并将 &str[0] 替换为 str.c_str()。
    • 在 Visual Studio 2015 中对我不起作用:请参阅 snag.gy/Hh2lJV.jpg
    【解决方案3】:

    这假设 wchar_t 在您的平台上使用 UTF-16(根据您提到的 ParseNetworkString(),我假设是 Windows)。它还假设 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 语言环境。

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2017-03-31
      • 2020-04-04
      • 1970-01-01
      相关资源
      最近更新 更多