将char *转换为LPWSTR

Convert char * to LPWSTR

本文关键字:LPWSTR 转换 char      更新时间:2023-10-16

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

我已经遍历了程序,并且在字符串字面值之前加上L,因此它们看起来像L"string"

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

我试过使它成为TCHAR,但它抱怨它不能将TCHAR转换为char *

我还有什么选择?

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

std::mbstowcs函数是您正在寻找的:

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

for string s

 string text = "something";
 wchar_t wtext[20];
 mbstowcs(wtext, text.c_str(), text.length());//includes null
 LPWSTR ptr = wtext;

--> ED: "L"前缀只对字符串字面量有效,对变量无效。& lt;——

使用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 -> wstringwstring -> string中。如果您还添加了一些微不足道的重载string -> stringwstring -> wstring,那么您可以轻松编写在任何设置下使用Winapi TCHAR类型定义进行编译的代码。

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

在多线程环境中,你应该传递一个线程本地转换状态作为函数的最终(目前不可见)参数。

这是我对这个话题的一个小抱怨

这个版本,使用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);
} 

我在vc++中使用以下代码,它对我来说很有魅力。

CA2CT(charText)

您可以使用CString, CStringA, CStringW来进行这些类型之间的自动转换和转换。此外,您还可以使用CStrBufCStrBufACStrBufW来获得RAII模式可修改的字符串