我正在尝试将多字节字符的程序转换为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"前缀仅适用于字符串文字,而不适用于变量.< -
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
- > wstring
和wstring
- >中包装此方法以及相反的方法string
.如果你还添加了琐碎的重载string
- > string
和wstring
- > wstring
,你可以TCHAR
在任何设置中轻松编写使用Winapi typedef 编译的代码.
[ 编辑: ]我添加了零初始化buf
,以防您计划直接使用C数组.std::wstring(buf, wn)
不过,我通常会返回结果,但是如果你打算使用C风格的空终止数组,请注意.[/]
在多线程环境中,您应该将线程局部转换状态作为其最终(当前不可见)参数传递给函数.
这是我对这个主题的一个小咆哮.
该版本使用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)
我在 VC++ 中使用以下内容,它对我来说就像一个魅力。
CA2CT(charText)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
112636 次 |
最近记录: |