在CString中保存了一个字符串,例如:
CString str("温度1261541875|ADC1:0.00V,ADC2:0.00V,ADC3:0.00V,ADC4:0.00V当前温度");
如何判断字符串中那些是中文字符,那些是ANSI字符?
CString str("温度1261541875|ADC1:0.00V,ADC2:0.00V,ADC3:0.00V,ADC4:0.00V当前温度");
如何判断字符串中那些是中文字符,那些是ANSI字符?
解决方案 »
- ipv4与ipv6编程时有什么区别
- 一个关于按钮控件子窗口的小问题
- 我有一个DLL要在VB中调用,但此DLL没有提供VB的API定义.我只好写一个二传手,但又不懂VC,编译老报错.
- 怎样将多个查询结果合并成一个查询结果
- CXXDialog 如何能捕捉到界面外的鼠标单击消息, / 如何能让一个菜单CMENU在显示中, 关掉, 正如菜单ITEM单击那样
- 如何让一个 CRichEditCtrl 里的字符串自动换行!
- 请教一个关于MSFlexGird控件单行显示的问题!急!非常感谢!
- doc类中增加变量只能是CString类吗
- 数据库连接 总是出错??!!!!!!!!!!!!!!!!!!!
- 请问 想写一个自动填写网页用户名的程序 教教我 比如用不用嵌入asm汇编代码 谢谢
- 关于 std::ifstream 的问题
- 485通信问题!!!急急
{
unsigned char sqChar[20];
sqChar[0]=*pText;
if (sqChar[0]>=0xa1)
if (sqChar[0]==0xa3)
return 1; //全角字符
else
return 2; //汉字
else
return 0; //英文、数字、英文标点
}
---------------------------------------------------------------
以下可能比较全一些,取得高字节HIBYTE(a),取得低字节LOBYTE(a)这两个宏会有所帮助
剩下的就是判断区间了 先转换为unicode,再判断每个字符的码所在区间,就可以相对准确的判断哪些是中文。粗略的判断可以用下面这个 bool IsChinese(unsigned char bC1,unsigned char bC2)
{
if((bC1>=0xa1)&&(bC1<=0xfe)&&
(bC2>=0xa1)&&(bC2<=0xfe))
return true;
return false;
}
CString str("温度1261541875|ADC1:0.00V,ADC2:0.00V,ADC3:0.00V,ADC4:0.00V当前温度");
应该是:
CString str(L"温度1261541875|ADC1:0.00V,ADC2:0.00V,ADC3:0.00V,ADC4:0.00V当前温度");如果是Unicode,只要判断字符值是否小于256就可以了,小于256的是数字、英文字母或符号。
因为需要把这些字符按4个比特一个单位来切分,然后编码,对于ANSI来说切分成2部分就可以了,对于中文字符就得切分成4部分。
所以需要从其中辨别是哪类字符。这种方式不知道是否可行。TCHAR ch = str.GetAt();
if (ch > 255)
{
中文字符
}
else
{
ANSI字符
}
ANSI的话,看如下的范例CString s;
s = "sss黄飞鹄9999";
int lens;
lens = strlen(s);
unsigned char s1[10],s2[10],s3[10];
unsigned char ch;
int l,m,n;
l=m=n = 0;
for(int i=0;i<lens;i++){
ch = s[i];
if(ch > 0x7f){
s1[l++] = ch;
}else if(ch >= '0' && ch <= '9'){
s2[m++] = ch;
}else{
s3[n++] = ch;
}
}
s1[l] = '\0';
s2[m] = '\0';
s3[n] = '\0';
CString cs;
cs = s1;
MessageBox(cs,"中文",MB_OK);
cs = s2;
MessageBox(cs,"数字",MB_OK);
cs = s3;
MessageBox(cs,"英文",MB_OK);
看看这个
呵呵,我以为MBCS就是指ANSI,我得去搜搜什么是MBCS了。