有关字符的检验
//*************************************
有一個win32?API函數BOOL?IsDBCSLeadByte(
??BYTE?TestChar???//?character?to?test
);
因為漢字都是雙字節字符其中第一個字節時引導字符
這個函數就是判斷第一個字節是否為引導字符。
如果是的話那么這個字符就是漢字或日文或朝鮮文
//******************************************
CString?ss="你好今天真熱asdfg";
CString?sE,sC;
int?j=0;
int?k=0;
int?i=0;
While(i<strlen(ss))
{
????if(ss[i]>=0xa0)//全角,中文
????{
????????sC+=ss[i];
????????sC+=ss[i+1];
????????i++;
????????i++;
????????j++;
????}
????else//半角,英文
????{
????????sE+=s[i];
????????i++;
????????k++;
????}
}
CString?msg;
msg.Format("有%d個全角字符:%s。有%d個半角字符:%s",j,sC,k,sE);
AfxMessageBox(msg);
********************************************
GB2312碼是中華人民共和國國家漢字信息交換用編碼,全稱《信息交換用漢字編碼字符集--基本集》,由國家標準總局發布,1981年5月1日實施,通行于大陸。新加坡等地也使用此編碼。
??? GB2312收錄簡化漢字及符號、字母、日文假名等共7445個圖形字符,其中漢字占6763個。GB2312規定"對任意一個圖形字符都采用兩個字節表示,每個字節均采用七位編碼表示",習慣上稱第一個字節為"高字節",第二個字節為"低字節"。GB2312-80包含了大部分常用的一、二級漢字,和9區的符號。該字符集是幾乎所有的中文系統和國際化的軟件都支持的中文字符集,這也是最基本的中文字符集。其編碼范圍是高位0XA1-0XFE,低位也是0XA1-0XFE;漢字編碼范圍是高位0XB0-0XF7,低位是0XA1-0XFE.
?
下面是用C寫的一個判斷漢字的程序:
#include<stdio.h>
int main(void)
??? {
?????? int i;
?????? unsigned char str[80];
?????? puts("input string:");
?????? scanf("%s",str);
?????? for(i=0;i<80&&str[i]!='\0';)
?????? {
??????????? if(str[i]>=0xb0&&str[i]<=0xf7&&str[i+1]>=0xa1&&str[i+1]<=0xfe)
??????????? {
???????????????? printf("chinese character\n");
???????????????? i+=2;
????????????}
????????????else
??????????? {
???????????????? printf("other character\n");
???????????????? i++;
??????????? }
????}
???????return 0;
??? }
GB2312編碼表鏈接:http://www.knowsky.com/resource/gb2312tbl.htm
//*************************************************************************
判斷輸入的是中文還是英文很簡單:
1、首先,要確認數據類型是字符型。
2、英文或一些特殊字符的ASCII碼小于0x7f。
3、中文是以區位碼形式出現的,ASCII碼大于0xa0。
比如:
#include <stdio.h>
#include<string.h>
int main()
{
char* ss="hello世界";
int i;
while(*str)
{
if((unsigned)*str>=161) {str+=2;i++;}
else str++;
}
printf("Chinese char number is:%d\n",i);
return 0;
}
//*********************************************
int is_zh_ch(char p)
{
if(~(p >> 8) == 0)
{
return 0;
}
return -1;
}
這是跟漢字的存儲方式有關,西文字符用ASCII碼的話,一個字節可以表示一個字符,而漢字用的是雙字節表示一個漢字。
那么,為了在機器內部區分ASCII碼和漢字機內碼,就規定漢字的兩個字節的最高為都為1.
例如:漢字“啊”的漢字機內碼為B0A1H
表示成雙字節是這樣的10110000 10100001
本程序用的就是判斷最高位的方法。
int is_zh_ch(char p)
{
if(~(p >> 8) == 0) 將p字節進行移位運算,右移8位,這樣,如果移位后是0,則說明原來的字節最高位為0,不是1那么也就不是漢字的一個字節。
{
return 0; //代表不是漢字
}
return -1;
}
和文字表示方法有關。西文字符一個字節(char)就可以表示(ASCII碼中包括了所有的西文字符),因為一個char只有8位,最多表示256個文字,因此而非西文字符的文字(UNICODE)全部用兩個字節表示,機器內部的最小存儲單位是字節,為了區分連續的兩個char表示的是一個UNICODE還是兩個西文字母,規定UNICODE碼的兩個字節的最高位都是1。
if(~(p >> 8) == 0) return 0;的意思是,將char p的符號位(char為8位,即最高位)右移,若是UNICODE則p>>8后為1111 1111,然后按位取反為0
其實原理上面說過了,UNICODE碼最高位為1,即符號位為1,上面的代碼和下面的等價:
int is_zh_ch(char p)
{
if(p<0) return 0;
return -1;
}
p是ASCII碼表示的啊,而英文的高8位全是0,漢字的高8位不為0,所以用>>右移判斷
//**********************************************************************
利用ASCII碼,如果是ASCII碼的值是負數(因為規定漢字的最高位是1而ASCII碼的最高位是0),則為漢字~~至于字母,對照ASCII碼的范圍可以確定~~
另外還要注意的是:一個漢字由兩個字節表示,所以所有負值個數的一半才是漢字的個數~~~
舉個例子
#include<iostream>
#include<string>
using namespace std;
void main()
{
int sum=0;
??? char a[123];
cin.getline(a,123);
for(int i=0;a[i]!='\0';i++)
{
? if(a[i]<0) sum++;
}
cout<<sum/2<<endl;
}
//---------------------------------------------------------------------------
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char str[]="你好,HelloWorld!";
int i;
for (i = 0; str[i]; ) {
if (str[i]<0) i+=2; /*如果是漢字,則跳過兩個字符*/
else if (isalpha(str[i])) ++i; /*如果是英語字母,則跳過一個字符*/
else { /*如果不是漢字,也不是英語字符,則輸出提示信息并跳過一個字符*/
printf("%d,ERROR!\n",i+1);
++i;
}
}
return 0;
}
//---------------------------------------------------------------------------
IsDBCSLeadByte
總結
- 上一篇: 动态分区添加的新字段无法插入数据
- 下一篇: 64位ie加载java失败_java-无