【问题标题】:How do I convert a char string to a wchar_t string?如何将 char 字符串转换为 wchar_t 字符串?
【发布时间】:2009-11-24 17:17:32
【问题描述】:

我有一个char* 格式的字符串,想将其转换为wchar_t*,以传递给Windows 函数。

【问题讨论】:

  • 大多数 Windows 函数实际上有两种版本,“A”和“W”版本。例如。 MessageBoxA / MessageBoxW,带有一个宏“MessageBox”,指代两者之一。但是,如果您使用显式的 MessageBoxA 名称,则可以传递一个独立于项目设置的 char*

标签: c++ windows string


【解决方案1】:

这个小功能有帮助吗?

#include <cstdlib>

int mbstowcs(wchar_t *out, const char *in, size_t size);

另见C++ reference

【讨论】:

    【解决方案2】:

    如果您不想链接到 C 运行时库,请使用 MultiByteToWideChar API 调用,例如:

    const size_t WCHARBUF = 100;
    const char szSource[] = "HELLO";
    wchar_t  wszDest[WCHARBUF];
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szSource, -1, wszDest, WCHARBUF);
    

    【讨论】:

    • 根据字符串的来源,您可能还需要考虑使用 CP_UTF8 而不是 CP_ACP。它可以存储所有Unicode字符。
    • 对于我在 windows10 上使用 Visual Studio 2017,CP_ACP 有效。 CP_UTF8 没有。
    【解决方案3】:

    Windows SDK 在 kernel32.lib 中指定了 2 个函数,用于将字符串从宽字符集转换为宽字符集。这些是MultiByteToWideChar()WideCharToMultiByte()

    请注意,与函数名所暗示的不同,字符串不一定使用多字节字符集,但可以是简单的 ANSI 字符串。另请注意,这些函数将 UTF-7 和 UTF-8 理解为多字节字符集。宽字符集始终为 UTF-16。

    【讨论】:

      【解决方案4】:

      schnaader的回答使用当前C语言环境定义的转换,这个使用C++语言环境接口(谁说简单?)

      std::wstring widen(std::string const& s, std::locale loc)
      {
          std::char_traits<wchar_t>::state_type state = { 0 };
      
          typedef std::codecvt<wchar_t, char, std::char_traits<wchar_t>::state_type >
              ConverterFacet;
      
          ConverterFacet const& converter(std::use_facet<ConverterFacet>(loc));
      
          char const* nextToRead = s.data();
          wchar_t buffer[BUFSIZ];
          wchar_t* nextToWrite;
          std::codecvt_base::result result;
          std::wstring wresult;
      
          while ((result
                  = converter.in
                        (state,
                         nextToRead, s.data()+s.size(), nextToRead,
                         buffer, buffer+sizeof(buffer)/sizeof(*buffer), nextToWrite))
                 == std::codecvt_base::partial)
          {
              wresult.append(buffer, nextToWrite);
          }
      
          if (result == std::codecvt_base::error) {
              throw std::runtime_error("Encoding error");
          }
          wresult.append(buffer, nextToWrite);
          return wresult;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-07-04
        • 1970-01-01
        • 2011-02-03
        • 2018-09-02
        • 2014-11-12
        • 1970-01-01
        • 1970-01-01
        • 2012-09-09
        相关资源
        最近更新 更多