CString显示中文的一些认识
2011-10-31 16:01:01| 分类: MFC | 标签: |举报 |字号大中小 订阅
当用CString格式话输出时,若有中文字符,则输出时有时会碰到问题,即显示为乱码。
在常规方式下,用CString的format方法,调用%c的方式,在中文为ASC编码方式时,这样没有任何问题。
在网上查了一个
int Lenth = m_strTxt.GetLength();
for(int i=0;i<Lenth;i++)
{
char c = m_strTxt.GetAt(i);
//是中文字符
if(c<0||c>255)
{
TRACE(“%s”,m_strTxt.Mid(i,2));
i++;
continue;
}
//是英文字符
else
TRACE(“%c”,c);
}
这个无非是解决TRACE输出问题,起始直接格式化到CString中,然后调用TRACE输出即可
但是当程序用UNICODE方式编译时,用%c输出的就是乱码
经过研究,发现CString在UNICODE方式下,内部编码用的是UTF8,因此需要将中文转换为UTF8方式,才能正常输出。
以下举例说明:
char test1[2];
test1[0] = 0xbd;
test1[1] = 0xda;
test1[2] = 0;
wchar_t pwc[2];
int cc = MultiByteToWideChar(CP_ACP, 0, test1, 2, pwc, 10);
pwc[cc] = 0;
str = pwc;
TRACE1(“%s”,str);
以上显示的中文为“节”,ASC的编码就是BDDA,但UTF8的编码就是8A82
至于test中的两个值,可以用以上网上获取的方式,判断是否大于127的方式来一次取两个。
当需要显示的数据是从文件中获取时,通过判断文件是否为UTF8格式还是ASC编码方式
可以作出是否转换的策略。可以看到当文件为UTF8方式时,文件开始的标识是
EFBBBFE8,好像第四个字节可以是E7或E8,我在ue力测试出来是E8。
另外,CstdioFile虽然继承自CFile,而且MSDN中只是介绍其ReadString和WriteString函数
实际上Read函数和CFile也有不同,我发现,它会将其中的0x0D去掉,即原来是0x0D,0x0A,实际读上来就只有0x0A了。
网上资料:0xFE 0xFF是unicode的header,而utf-8的是0xEF 0xBB 0xBF