hur.cn - 华软网

 热门搜索

CString截取乱码问题

  作者:未知    来源:网络    更新时间:2011/2/12
现在有一串字符中含有汉字和英文或数字,要从中按固定的长度。但是遇到截取的地方为汉字时,就会出现乱码
比如
CString str="我们是朋友";
CString str1=str.Left(3);
这个str1输出就是乱码了。
但是这个字符串不固定的,如果
str="大1新生报到";
str1=str.Left(3);
输出就是正常的了。
现在想要如果这里的3是指3个字符,比如前面的要是"我们是",后面的好例子要是"大1新",要怎么处理?
---华软 网友回答---
改成UNICODE,ANSI下汉字占2个字节
---华软网友回复---
有没有方法在程序当中改?我就只有一个地方用到这个Left和Right。其它的都没用到。
---华软网友回复---
除非你不用CString,否则你必须改成UNICODE
---华软网友回复---
你查询下每个字符的值是否为负数,用一个变量加1来记录到第3位时这个变量是否为偶数,是的,那就直接取这3位,若不是的,就取到第4位
---华软网友回复---
引用 4 楼 fishion 的回复:
你查询下每个字符的值是否为负数,用一个变量加1来记录到第3位时这个变量是否为偶数,是的,那就直接取这3位,若不是的,就取到第4位

  ding~!
---华软网友回复---
两种方式:
1、对截取的字符用Unicode编码。WCHAR字符数组,截取后再转换回来。
2、用char数组,一个一个字符的判断是不是中文,中文的话跳过一个字节。
---华软网友回复---
引用 6 楼 allen_zhang 的回复:
两种方式:
1、对截取的字符用Unicode编码。WCHAR字符数组,截取后再转换回来。
2、用char数组,一个一个字符的判断是不是中文,中文的话跳过一个字节。

 。。
---华软网友回复---
用Unicode编码
---华软网友回复---
用UNICODE编码
或者不用CString
用string
---华软网友回复---
按偶数取吧。。
---华软网友回复---
CStringW,CStringA
---华软网友回复---
ASCII码下汉字由2位ASCII码表示,且第一位一定小于0。也就是说unsigned char的情况下,汉字的第一位ASCII码一定属于[128, 255]。所以你数个数的时候按字节数,每数到一个负数就多加一个字节。这样就不会有汉字截断了。

UNICODE下每个字符占两个字节,汉字两个字节都不为0,英文和数字第二个字节总是0。不过如果你只是数数的话,每次数两个字节就行了。

http://www.cppblog.com/Jrong/archive/2009/03/24/77703.html
http://www.99inf.net/SoftwareDev/VC/28922.htm
以上两个网站的东西可能有用,你看看吧。
---华软网友回复---
对了,Left、Right、Mid三个函数的参数就是以字节为单位的,所以你要自己数好字节数,之前写过一个程序,但比你的要求跟复杂些,我也懒得改,就不贴出来了,自己试试,不难的。
---华软网友回复---
一楼正解!
建议试试STL里的string!
---华软网友回复---
引用 12 楼 swkjd 的回复:
ASCII码下汉字由2位ASCII码表示,且第一位一定小于0。也就是说unsigned char的情况下,汉字的第一位ASCII码一定属于[128, 255]。所以你数个数的时候按字节数,每数到一个负数就多加一个字节。这样就不会有汉字截断了。

UNICODE下每个字符占两个字节,汉字两个字节都不为0,英文和数字第二个字节总是0。不过如果你只是数数的话,每次数两个字节就行了。

http:……


不必须的情况下个人觉得最好用std::string 和Unicode字符标准,本人曾有这方面的教训,是两个不同版本的VC之间的同一程序移植,用的CString出好多问题,后来统一用std::string就好多了
---华软网友回复---
汉字是占两个字节的,所以你的Left只取3个字节就会报错,应该是4个字节;
你第二个是因为第二个字符是数字,它占一个字节,加上前面一个汉字就是3个字节,当然正确了
---华软网友回复---
改成UNICODE什么都解决了。
---华软网友回复---
先转换为wchar[]再截取可以么?
---华软网友回复---
先判断是中文,还是英文,然后再一个一个char处理

---华软网友回复---
谢谢各位回复。已使用"判断是中文还是英文”的方式解决了。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。