判断字符编码是否大于127,如果大于,则是英文字符所不存在的,简单的判定是中文。
实现的原理就是:
具体的参见《ANSI和Unicode编码内部是什么样的》,别人写的很清楚,就不重复了。
下面是C/C++的实现方式:
#include <iostream>
bool IsChineseA(unsigned char* chBuf,int iBufSize);// - ANSI版本
bool IsChineseU(wchar_t* chBuf,int iBufSize); // - Unicode版本
int main()
{
using std::cout;
unsigned char strA[] = "0这0是0含0有0中0文0的0字0符0串0";
wchar_t strU[] = L"0";
if(IsChineseU(strU,sizeof(strU)))
cout<<"含有中文n";
else
cout<<"不含中文n";
return 0;
}
bool IsChineseA(unsigned char* chBuf,int iBufSize) //是否含有中文
{
for (int i = 0 ; i < iBufSize; i++)
{
if (chBuf[i] > 127)
{
return true; //超过ASCII编码范围
}
}
return false;
}
bool IsChineseU(wchar_t* chBuf,int iBufSize) //是否含有中文
{
/*
- wchar_t类型接受参数,是方便传参,但是内部还是以单字节挨个的处理
- 此处也可以按照宽字符形式,读取,然后直接将整个宽字符的两个字节一起的编码值拿来判断
- 如果大于127说明一定不是英文字符。一般判断两个字节的低字节(前一个)就已经大于127了。
- 如果图省事,就直接两个读取此宽字符,判断字符编码值就可以了。
*/
char * pBuf = (char*)chBuf;// - 因为是对字节的解释,要转成单字节的模式,挨个字节的分析。图省事就不用这一句,那么此时需要将字符缓冲的字节大小除以2得到字符个数。
for (int i = 0 ; i < iBufSize; i++)
{
if (i%2)
{
if (pBuf[i] > 127)
{
return true; //超过ASCII编码范围
}
}
}
return false;
}
下面是MFC版本:
BOOL IsChinese(CString strText) //是否含有中文
{
int nLen = strText.GetLength();
for (int i = 0 ; i < nLen; i++)
{
if (strText[i] > 127)// - 将字符的整体两个字节的编码值拿来判断
{
return TRUE; //超过ASCII编码范围
}
}
return FALSE;
}