我正在尝试将多字节字符的程序转换为Unicode。
我已完成该程序,并在字符串文字前面加L
,因此它们看起来像L"string"
。
这已经奏效但我现在留下了一个不符合的C风格字符串。我已经尝试了L
并将其放入TEXT()
但L
被添加到变量名称 - 而不是字符串 - 如果我使用TEXT()
。
我尝试将其设为TCHAR
,但后来却抱怨它无法将TCHAR
转换为char *
。
我还有哪些选择?
我知道C和C ++是不同的。它是一个古老的内部C库,已经在C ++项目中使用了好几年了。
答案 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; wstring
和wstring
- &gt; string
中包装此方法以及相反的方法。如果您还添加了琐碎的重载string
- &gt; string
和wstring
- &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)
您可以使用CString
,CStringA
,CStringW
进行自动转换并在这些类型之间进行转换。此外,您还可以使用CStrBuf
,CStrBufA
,CStrBufW
来获取RAII模式可修改的字符串
答案 4 :(得分:0)
我在VC ++中使用以下内容,它对我来说就像是一种魅力。
CA2CT(charText)