将char*转换为LPWSTR

Ske*_*ith 33 c c++ string

我正在尝试将多字节字符的程序转换为Unicode.

我已经完成了程序,并在字符串文字之前,L所以它们看起来像L"string".

这已经奏效但我现在留下了一个不符合的C风格字符串.我已经尝试了L并将其放入TEXT()但是将其L添加到变量名称 - 而不是字符串 - 如果我使用的话TEXT().

我已经尝试过制作它TCHAR然后它抱怨它无法转换TCHAR为a char *.

我还有哪些选择?

在你疯狂地投票之前我知道C和C++是不同的.它是一个古老的内部C库,已经在C++项目中使用了好几年了.

Rap*_* R. 41

std::mbstowcs功能正是您所需要的:

 char text[] = "something";
 wchar_t wtext[20];
 mbstowcs(wtext, text, strlen(text)+1);//Plus null
 LPWSTR ptr = wtext;
Run Code Online (Sandbox Code Playgroud)

- > ED:"L"前缀仅适用于字符串文字,而不适用于变量.< -

  • 平台是Windows,这是相当隐含的,但如果你不这么认为,请继续并证明我是错的. (4认同)

Ker*_* SB 12

干净的方法mbstowcs是调用它两次以查找结果的长度:

  const char * cs = <your input char*>
  size_t wn = mbsrtowcs(NULL, &cs, 0, NULL);

  // error if wn == size_t(-1)

  wchar_t * buf = new wchar_t[wn + 1]();  // value-initialize to 0 (see below)

  wn = mbsrtowcs(buf, &cs, wn + 1, NULL);

  // error if wn == size_t(-1)

  assert(cs == NULL); // successful conversion

  // result now in buf, return e.g. as std::wstring

  delete[] buf;
Run Code Online (Sandbox Code Playgroud)

不要忘记setlocale(LC_CTYPE, "");在程序开始时打电话!

Windows的优势MultiByteToWideChar在于它完全是标准C,但在Windows上您可能更喜欢Windows API功能.

我通常在两个转换函数string- > wstringwstring- >中包装此方法以及相反的方法string.如果你还添加了琐碎的重载string- > stringwstring- > wstring,你可以TCHAR在任何设置中轻松编写使用Winapi typedef 编译的代码.

[ 编辑: ]我添加了零初始化buf,以防您计划直接使用C数组.std::wstring(buf, wn)不过,我通常会返回结果,但是如果你打算使用C风格的空终止数组,请注意.[/]

在多线程环境中,您应该将线程局部转换状态作为其最终(当前不可见)参数传递给函数.

这是我对这个主题的一个小咆哮.

  • +1用于显示如何调用该函数两次以获取输出缓冲区的长度 (2认同)

Dav*_*nan 5

该版本使用Windows API函数MultiByteToWideChar(),处理任意长输入字符串的内存分配。

int lenA = lstrlenA(input);
int lenW = ::MultiByteToWideChar(CP_ACP, 0, input, lenA, NULL, 0);
if (lenW>0)
{
    output = new wchar_t[lenW];
    ::MultiByteToWideChar(CP_ACP, 0, input, lenA, output, lenW);
} 
Run Code Online (Sandbox Code Playgroud)


Mor*_*key 5

我在 VC++ 中使用以下内容,它对我来说就像一个魅力。

CA2CT(charText)
Run Code Online (Sandbox Code Playgroud)

  • 请记住包含该宏 #include &lt;atlstr.h&gt; (4认同)