将char *转换为LPWSTR

时间:2011-07-28 11:55:38

标签: c++ c string

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

我已完成该程序,并在字符串文字前面加L,因此它们看起来像L"string"

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

我尝试将其设为TCHAR,但后来却抱怨它无法将TCHAR转换为char *

我还有哪些选择?

我知道C和C ++是不同的。它是一个古老的内部C库,已经在C ++项目中使用了好几年了。

5 个答案:

答案 0 :(得分:39)

您正在寻找std::mbstowcs功能:

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

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

答案 1 :(得分: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;

不要忘记在程序开头调用setlocale(LC_CTYPE, "");

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

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

[编辑:]我向buf添加了零初始化,以防您计划直接使用C数组。我通常会将结果返回为std::wstring(buf, wn),但是如果您打算使用C样式的以null结尾的数组,请注意。[/]

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

以下是关于此主题的small rant

答案 2 :(得分:4)

此版本使用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);
} 

答案 3 :(得分:1)

您可以使用CStringCStringACStringW进行自动转换并在这些类型之间进行转换。此外,您还可以使用CStrBufCStrBufACStrBufW来获取RAII模式可修改的字符串

答案 4 :(得分:0)

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

CA2CT(charText)