如何判断CString中的字符是中文还是ANSI字符 在CString中保存了一个字符串,例如:CString str("温度1261541875|ADC1:0.00V,ADC2:0.00V,ADC3:0.00V,ADC4:0.00V当前温度");如何判断字符串中那些是中文字符,那些是ANSI字符? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先您的说法有问题,中文字符和ANSI字符不成对立面。 从头开始逐个取字符串中的每个元素(char类型),如果元素的值小于0,则说明该元素与下一元素共同组成一个中文字符;如果大于0,则是数字、英文字母或符号。 int IsGB(PTSTR pText) { unsigned char sqChar[20]; sqChar[0]=*pText; if (sqChar[0]>=0xa1) if (sqChar[0]==0xa3) return 1; //全角字符 else return 2; //汉字 else return 0; //英文、数字、英文标点 } 中文的unicode码的范围4e00-9fa5 --------------------------------------------------------------- 以下可能比较全一些,取得高字节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; } Unicode的字符串常量怎么会这么写?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的是数字、英文字母或符号。 你这是Unicode?真的假的,要么写个L要么用_T(),你啥都没有 使用CString的GetAt,跟踪的时候可以看到中文字符的编码值,比方“温”是28201,ANSI字符是小于256的。因为需要把这些字符按4个比特一个单位来切分,然后编码,对于ANSI来说切分成2部分就可以了,对于中文字符就得切分成4部分。所以需要从其中辨别是哪类字符。这种方式不知道是否可行。TCHAR ch = str.GetAt();if (ch > 255){ 中文字符}else{ ANSI字符} Unicode的很好解决,直接取得每一个字符,判断字符值就行了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还是Unicode 我的项目整个是Unicode的,所以这么写,CString也会自动转成Unicode。 http://jlqzs.blog.163.com/blog/static/2125298320070101826277/看看这个 呵呵,我以为MBCS就是指ANSI,我得去搜搜什么是MBCS了。 100分求如何通过createprocess启动进程如何设定启动的窗体位置和大小? vc 请问怎样显示窗体客户区外的图像 如何在程序内部控制自身的卸载 在WinXP运行得好好的程序,到了Win2K下出现"无法定位程序输入点getaddrinfo于动态链接库WS2_32.dll上"的错误 一直没有搞清楚数组的赋值 谈vc学习------年薪36万 用ADO连接EXCEL后,要怎样向EXCEL里面写数据!! 关于对文件的操作? 请问各位有谁知道BOM是什么意思 关于无模的PropertySheet 关于 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了。