CString format with Unicode returns wrong character
I'm trying to format a CString using the following code:
const wchar_t * wch = L"μ";
CString str;
str.Format(_T("%c"), wch[0]);
However, instead of str having the value of "μ" it actually is set to "¼". When I debug it, it recognizes wch as "μ".
Further, if I do:
const wchar_t * wch = L"μ";
CString str;
str.Format(_T("%s"), wch);
it gives str with value "¼". (It doesn't seem to show up but there should be a superscript L after the ¼.)
The compiler is set to use unicode, as else where in the program I am able to call _T() and have it evaluate correctly,开发者_高级运维 just not when formatting a CString.
What am I doing wrong?
*Edit: * Doing more debugging shows that the CString Format method's arglist receives a value of "Ü_"
I believe you need to use a "long" char or string format specifier -- so %lc
for the wchar_t
and %ls
or %S
for the string.
Try
setlocale(LC_ALL, "");
before calling Format. (Unless you're doing anything unusual, it's enough to call setlocale once near the beginning of your application.)
I see Miu
with %c
and with %lc
// a1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <afx.h>
int _tmain(int argc, _TCHAR* argv[])
{
const wchar_t * wch = L"μ";
CString str;
str.Format(_T("%c"), wch[0]);
MessageBox( GetForegroundWindow(), str.GetBuffer(), L"MyChar", MB_OK + MB_ICONHAND );
str.Format(_T("%s"), wch);
MessageBox( GetForegroundWindow(), str.GetBuffer(), L"MyChar", MB_OK + MB_ICONHAND );
return 0;
}
精彩评论