求字符串长度 如CString str =“a44bc123阿萨德【】[]”;str中含有中文,英文和符号等如何取出最后10个字呢。不是字符,是字。中文,英文都算一个字 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一个汉字占两个字节。这样你用substr=str.right(20);试试 C++判断一个char字符串,下标为N是不是汉字.思路:C++中的通用方法是判断这个char的最高位是不是为1,因为英文字符的值一定小于0x80,即最高们是0,而中文字符(所占的两个字符都是)的最高位是1.(但有些特殊字符也是1,比如:★(A1EF、U+2605)等等这些字符。应当注意).//代码示例:char * str[50] = “test!我们test.”;if(str[i] & 0x80 ) // 下标为 i 是个中文字符(或半个中文字符);else // 下标为 i 是个英文字符;//下面是我常用的取字符串位置的函数int GetCharPos(const string &str, int pos){ int i = 0; for (; i < (int)str.size() && i < pos; ++i) { if (str[i] & 0x80) ++i; } return i;} 判断字符是不是大于7F大于7F就不是ASCII码这时过两个字符也就是一个非ASCII符号 首先要确定你使用的是什么字符集,如果是uniceode的话,每个字符占两个字节,如果是utf-8的话,英文字符占一个字节,中文一般是三个字节,不同的字符集有自己的编码规范。确定了字符集后,再根据这种字符集的编码规范就可以分析出每一个字符(英文,中文) 有个api判断一个字节是不是双字节的第一个字节,叫IsDBbytelead什么的,你查一下吧 从字符串的最右边操作判断当前序号的字符是英文还是中文或者是其它符号, 如果是英文或者中文就将计数器加1, 当计数值为10后就停止操作:CString sourceStr;//源字符串sourceStr.MakeLower();//转为小写BYTE count = 0;char result[20] = {0};int len = sourceStr.GetLength();for(int i = len - 1; i >= 0; i --){ //英文字符 if(sourceStr[i] >= 'a' && sourceStr[i] <= 'z') { result[count] = sourceStr[i]; count ++; } //中文(占两个字节) else if((sourceStr[i] & 0x80) && i < len - 1) { result[count] = sourceStr[i]; result[count + 1] = sourceStr[i + 1]; count ++; } if(count >= 10) break;}//读取结果时, 直接对result字符数组从序号i=0开始判断即可 纠正一点,如果说中文占两个字节绝对是错误的,前面已经说过不同的字集有不同的规范,比如说utf-8编码,三字节表示一个汉字,第一字节为1110....,第二字节为10.....,第三字节为10.....,而gb2312则又不同,他两字节表示一汉字,但他有一个汉字的编码范围。都不知道是什么编码,谈何分离每一个字符?我不知道楼主弄这个有什么用,如果要分离每一个字符的话,应当首先确定字符串的编码方式,确定后再说怎么分离的问题。 char *pc="a44bc123阿萨德【】[]";char *p = pc;while(*p){ if( *p < 0 ) break; p ++;}//p就是中文开始了 http://blog.csdn.net/tangaowen/archive/2008/06/11/2535370.aspx上面的问题和你的差不多,有程序另外要区分gbk以及gb18030,他们是gb2312的超集,下面的一段话从百度百科找的,祝你成功:http://baike.baidu.com/view/1250144.htmGB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。 xiexie 大家了 这问题已经解决了 3Q CString str ="a44bc123阿萨德【】[]"; int nLastWord = 10; int i=str.GetLength() - 1; CString sResult; while(i >= 0 && nLastWord > 0) { if(str[i]>=0xa0)//全角,中文 { sResult+=str[i]; sResult+=str[i - 1]; i = i - 2; } else//半角,英文 { sResult+=str[i]; i --; } nLastWord -- ; } CString sNewstr; for(i =0;i < sResult.GetLength();i ++) sNewstr += sResult[sResult.GetLength() - 1 -i]; 这样的结果不是最后十个字 如“a44bc123阿萨德【】[]” ,最后10个字应该为“123阿萨德【】[]”这个跟编码格式有关 前面几楼有高手指点了 谢谢你了 win2003-64bit如何使用DLL? 这个错误什么意思 一个最简单的WINDOWS窗口程序文件后缀问题 CFile传参问题 怎么通过USB取得手机文件夹 这个问题复杂吗?还是我太笨了?请大家指点指。 怎么让ListBox动态的显示内容 求教:蓝屏报错 怎样使用帐号远程登录DCOM服务器 MFC中创建全局结构体 高分求系统托盘处气泡的单击响应方法 请wwwllg进来接分,谢谢帮助!
思路:
C++中的通用方法是判断这个char的最高位是不是为1,因为英文字符的值一定小于0x80,即最高们是0,而中文字符(所占的两个字符都是)的最高位是1.
(但有些特殊字符也是1,比如:★(A1EF、U+2605)等等这些字符。应当注意).
//代码示例:
char * str[50] = “test!我们test.”;if(str[i] & 0x80 )
// 下标为 i 是个中文字符(或半个中文字符);
else
// 下标为 i 是个英文字符;//下面是我常用的取字符串位置的函数
int GetCharPos(const string &str, int pos)
{
int i = 0;
for (; i < (int)str.size() && i < pos; ++i)
{
if (str[i] & 0x80)
++i;
}
return i;
}
判断字符是不是大于7F
大于7F就不是ASCII码
这时过两个字符也就是一个非ASCII符号
CString sourceStr;//源字符串
sourceStr.MakeLower();//转为小写
BYTE count = 0;
char result[20] = {0};
int len = sourceStr.GetLength();
for(int i = len - 1; i >= 0; i --)
{
//英文字符
if(sourceStr[i] >= 'a' && sourceStr[i] <= 'z')
{
result[count] = sourceStr[i];
count ++;
}
//中文(占两个字节)
else if((sourceStr[i] & 0x80) && i < len - 1)
{
result[count] = sourceStr[i];
result[count + 1] = sourceStr[i + 1];
count ++;
}
if(count >= 10)
break;
}
//读取结果时, 直接对result字符数组从序号i=0开始判断即可
我不知道楼主弄这个有什么用,如果要分离每一个字符的话,应当首先确定字符串的编码方式,确定后再说怎么分离的问题。
char *p = pc;
while(*p)
{
if( *p < 0 ) break;
p ++;
}
//p就是中文开始了
http://baike.baidu.com/view/1250144.htmGB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。
CString str ="a44bc123阿萨德【】[]";
int nLastWord = 10;
int i=str.GetLength() - 1;
CString sResult;
while(i >= 0 && nLastWord > 0)
{
if(str[i]>=0xa0)//全角,中文
{
sResult+=str[i];
sResult+=str[i - 1];
i = i - 2;
}
else//半角,英文
{
sResult+=str[i];
i --;
}
nLastWord -- ;
}
CString sNewstr;
for(i =0;i < sResult.GetLength();i ++)
sNewstr += sResult[sResult.GetLength() - 1 -i];
这样的结果不是最后十个字
如“a44bc123阿萨德【】[]” ,最后10个字应该为“123阿萨德【】[]”
这个跟编码格式有关 前面几楼有高手指点了
谢谢你了