关于多字节字符集下的CString的截取时中文乱码问题?

silencereader 2019-12-20 08:55:42
最近遇到了一个乱码问题,最后分析发现是由于字符串截取乱码问题造成的。
问题如下:
一个多字节的字符集的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的。

在这里发帖子就是想抛砖引玉,希望各位大佬,能给我点更好的办法。


...全文
417 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
silencereader 2019-12-23
  • 打赏
  • 举报
回复
引用 3 楼 sdghchj 的回复:
你这个笨方法貌似连通用性都没有
我知道啊!而且,数据大的话,还会影响速度的,暂时没想到什么好的办法,就只能发帖子问问啦。不过幸好现在数据都不是很大。
silencereader 2019-12-23
  • 打赏
  • 举报
回复
前人栽树,后人乘凉啊!我也不知道是谁栽的树,反正就是很凉快!
走好每一步 2019-12-23
  • 打赏
  • 举报
回复
不是Unicode工程也能使用Unicode函数的....
silencereader 2019-12-20
  • 打赏
  • 举报
回复
感谢1楼大佬的指教,前2个问题确实是我在写代码的时候没考虑到的,我现在的问题就是因为宽窄字符截断中文时引起的乱码,第三个问题在有中文的时候是可能产生乱码的,上述的代码只是我自己的一个思路,希望各位有更好的办法能和我分享下,谢谢!
月凉西厢 2019-12-20
  • 打赏
  • 举报
回复
感觉你写的代码有很多问题: 1,CString 能strlen()操作么?不应该是str.GetLength();或者转成char*后在strlen么? 2,unsigned char ch = str[i]; str不是char*类型的,这里会不会宽窄字符不匹配而存在截断? 3,仔细看一下当CString存在中文,left(pos)返回的是什么
sdghchj 2019-12-20
  • 打赏
  • 举报
回复
有中文串截取这种需求时最好还是用UNICODE编码下的CString或者标准库中的wstring。 不然就得自己去实现很多字符串计算的函数,比如len,mid(substr), left,right, find。。。。。。 其实最开始在设计多字节编码下的CString和string时,如果能提供一个构造入口让coder自定义怎么叫“一个字符”,这或许能更符合各国的文字编码实际情况,可惜没有,它们提供的就是完全隔离的UNICODE编码下的CString和标准库中的wstring。
sdghchj 2019-12-20
  • 打赏
  • 举报
回复
你这个笨方法貌似连通用性都没有

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧