将char *转换为LPWSTR
Convert char * to LPWSTR
我正在尝试将多字节字符程序转换为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
-> wstring
和wstring
-> string
中。如果您还添加了一些微不足道的重载string
-> string
和wstring
-> 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
来进行这些类型之间的自动转换和转换。此外,您还可以使用CStrBuf
、CStrBufA
、CStrBufW
来获得RAII模式可修改的字符串
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 CComPtr<IShelltem2> 转换为 LPWSTR*?
- 如何从 LPWSTR** 转换为 std::vector<std::wstring>
- 将参数转换为lpwstr createProcess
- 从LPWSTR转换为LPTSTR
- 如何使用jni将java中的Arraylist转换为c中的lpwstr
- 使用 ATL 将 LPTSTR 转换为 LPWSTR
- 如何将 CString 转换或转换为 LPWSTR
- 如何从 LPWSTR 转换为 'const char*'
- 如何将LPCWSTR转换为LPWSTR
- atlbase.h 编译器错误 :- 无法将参数从'bool'转换为'LPWSTR'
- 错误 C2664:"wsprintfW":无法将参数 1 从"字符 *"转换为"LPWSTR"
- 将char *转换为LPWSTR
- win32 创建进程无法将参数 2 从'char *__w64 '转换为'LPWSTR'错误
- 无法将 CHAR 转换为 LPWSTR
- 将LPWSTR转换为v8::String