关于多字节字符集下的CString的截取时中文乱码问题?
问题如下:
一个多字节的字符集的CString str,在vs中使用字符串截取函数Left、Right、和Mid做截取的时候可能会出现乱码的情况。我自己用了一个很笨的办法处理了下,想问下各位大佬有没有更好的办法。
我的笨方法如下:
CString str = "中国万岁123中国万岁";
int i = 0;
int pos[1024];
int cstrlen = strlen(str);
while (i < cstrlen)
{
unsigned char ch = str[i];
if ((int)ch>0xa0)//如果是中文就把汉字占的2位位置放入数组
{
pos[i] = i;
pos[i + 1] = i;
i = i + 2;
}
else
{
i = i + 1;
}
};
int len = 7;//截取长度
CString strleft;
if (pos[len] != pos[len - 1])//可以截取
strleft = str.Left(len);
else
strleft = str.Left(len - 1);大概想法就是用数组来存放中文字符的位置,然后判断截取的位置是不是刚好把一个中文汉字劈开了,最后决定怎么截取。
在这个笨办法之前,有过其他的办法,但是没成功。
1、尝试过把这个字符串转成宽字符,看了些网上的操作,然后试了下,乱码问题还是没有解决,不知道时我的转换有问题还是怎么样,而且当时也没有想清楚转换之后截取长度的问题,最后放弃了。
2、声明一点:不可能整个项目转成Unicode的。
在这里发帖子就是想抛砖引玉,希望各位大佬,能给我点更好的办法。
相关推荐
Unicode下CString与char*之间的转换(vs2008绝对实用)
在VS2008中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多字节字符集(MBCS:Multi-Byte Character Set),这样导致在VC6.0中非常简单实用的各类字符操作和函数在VS2008环境下运行时会报各种各样的错误,这里总结了在VS2008环境中 Unicode字符集下CString和char *之间相互转换的几种方法,其实也就是Unicode字符集与MBCS字符集转换。
VS2010 控件出现乱码的问题
本文章是关于VS2010 控件显示CString类型的字符串,出现乱码的问题 。
MFC在unicode字符集下的多字节串口调试助手
MFC在unicode字符集下的多字节串口调试助手,涉及到了MFC在unicode编码和多字节编码之间的转换,所用的编译器为VS2013,可以直接在VS2013中运行
解决打开、保存文件对话框下拉框中文乱码
解决打开、保存文件对话框下拉框中文乱码CFileDialog DlgOpen(FALSE,"*.*",NULL, OFN_OVERWRITEPROMPT,strfilter,FromHandle(this->m_hWndhw),0,FALSE);
SQLite-with-MFC-in-Chinese:MFC SQLite 不会中文乱码
SQLite-with-MFC-in-Chinese MFC SQLite 不会中文乱码 SQLite3 是用C 语言编写的开源数据库,可移植性好,容易非常简单,而且及其轻便。 但是各种中文乱码 使用后 Build sqlite.lib 官网上只有源代码和dll文件下载,这里记录由源代码导出的lib库文件步骤。 从下载sqlite-amalgamation-xxxx.zip。解压缩后得到sqlite3.c 、sqlite3.h2个文件。 打开vs2010 ,档案-> 新增专案-> Visual C++ -> Win32 -> Win32 专案,项目名称输入sqlite,点击下一步, 应用程序类型选择"静态程式库", 取消“预编译头” 将sqlite3.c,sqlite3.h两个文件复制到这个专案目录下,在项目中将这两个文件加到对应的Header和Source里,直接build,然后


