如何判断全角半角

本文介绍了一个简单的C++程序,用于统计字符串中的中文字符和英文字符数量。通过逐字符扫描并利用ASCII值判断字符类型的方法,实现了对输入字符串中不同类型的字符计数。

int IsChineseOrEnglish(LPCSTR pText)
{
 unsigned char sqChar[10];
 sqChar[0]=*pText;
 sqChar[1]='/0';
 if (sqChar[0]>=0xa1)
 {
  if (sqChar[0]==0xa3)
  {
   return 1;//全角字符  }
  else
  {
   return 2;//汉字  }
 }
 else
 {
  return 0;//英文,英文标点,数字

 }
}
bool GetNumChineseAndNumEnglish(const char*pSrc, int &nNumChiRet, int &nNumEngRet)//获得汉字与英文的个数
{
 if (pSrc == NULL)
 {
  return false;
 }
 else
 {
  int nLen = strlen(pSrc);
  char *pTxt = new char[nLen +1];
  char *pHeader = pTxt;
  //LPCSTR pTxt = pSrc;
  strcpy(pTxt, pSrc);
  pTxt[nLen] = '/0';
  while (*pTxt != '/0')
  {
   int nRet = IsChineseOrEnglish(pTxt);
   switch (nRet)
   {
   case 0:
    ++ nNumEngRet;
    pTxt++;
    break;
   case 1:
   case 2:
    ++ nNumChiRet;
    pTxt++;
    pTxt++;
    break;
   default:
    break;
   }
   
  }
  if (pHeader != NULL)
  {
   delete [] pHeader;
   pHeader = NULL;
  }
  return true;
 }
}

下面是完整的测试程序:

#include <windows.h>  
#include <iostream>
using namespace std;
int IsChineseOrEnglish(LPCSTR pText);
bool GetNumChineseAndNumEnglish(const char*pSrc, int &nNumChiRet, int &nNumEngRet);ÎĵÄ×Ö·û¸öÊý
int main(int argc,char**argv)  
{  

 int nNumChin = 0;
 int nNumEng = 0;
 GetNumChineseAndNumEnglish("£áÑîСӱYanger7", nNumChin, nNumEng);
 cout << "Number of Chinese:" << nNumChin << endl;
 cout << "Number of English:" << nNumEng << endl;
 return 0;  
}  


int IsChineseOrEnglish(LPCSTR pText)
{
 unsigned char sqChar[10];
 sqChar[0]=*pText;
 sqChar[1]='/0';
 if (sqChar[0]>=0xa1)
 {
  if (sqChar[0]==0xa3)
  {
   return 1;  }
  else
  {
   return 2;//ºº×Ö
  }
 }
 else
 {
  return 0; }
}
bool GetNumChineseAndNumEnglish(const char*pSrc, int &nNumChiRet, int &nNumEngRet){
 if (pSrc == NULL)
 {
  return false;
 }
 else
 {
  int nLen = strlen(pSrc);
  char *pTxt = new char[nLen +1];
  char *pHeader = pTxt;
  //LPCSTR pTxt = pSrc;
  strcpy(pTxt, pSrc);
  pTxt[nLen] = '/0';
  while (*pTxt != '/0')
  {
   int nRet = IsChineseOrEnglish(pTxt);
   switch (nRet)
   {
   case 0:
    ++ nNumEngRet;
    pTxt++;
    break;
   case 1:
   case 2:
    ++ nNumChiRet;
    pTxt++;
    pTxt++;
    break;
   default:
    break;
   }
   
  }
  if (pHeader != NULL)
  {
   delete [] pHeader;
   pHeader = NULL;
  }
  return true;
 }
}

### 判断全角半角字符的字节数差异 在 VBScript 中,`LenB` 函数用于返回字符串所占用的字节数,而非字符数。该函数的行为受当前编码环境的影响。在不同的编码模式下,全角半角字符的字节长度会有所不同,特别是在启用 `Session.CodePage=65001`(UTF-8 编码)时,所有字符均被视为 Unicode 字符,每个字符占用 2 字节,导致 `LenB` 返回的字节长度与预期不符[^1]。 #### 默认编码下的 `LenB` 行为 在未启用 UTF-8 编码的环境下(如默认的 GBK 或 Shift-JIS 编码),`LenB` 的计算方式如下: - **半角字符**(ASCII 字符):每个字符占 1 字节。 - **全角字符**(如中文):每个字符占 2 字节。 例如: ```vbscript Dim s s = "A" Response.Write LenB(s) ' 返回 1 s = "中" Response.Write LenB(s) ' 返回 2 ``` 此行为适用于判断全角半角字符的字节数差异,适用于需要区分字符类型的应用场景。 #### UTF-8 编码环境下的 `LenB` 行为 在启用 `Session.CodePage=65001` 的环境下,VBScript 将字符串视为 Unicode 处理,每个字符占用 2 字节,无论其是全角还是半角字符。此时,`LenB` 函数返回的字节长度将不再能区分全角半角字符: ```vbscript Session.CodePage = 65001 Dim s s = "A" Response.Write LenB(s) ' 返回 2 s = "中" Response.Write LenB(s) ' 返回 2 ``` 此时无法通过 `LenB` 函数直接判断全角半角字符的字节数差异,需采取其他方法进行处理。 #### 使用 `Len` 与 `LenB` 结合判断字符类型 在 UTF-8 编码环境下,可以通过 `Len` 和 `LenB` 的比值来判断字符类型: - 若 `LenB(str) = Len(str) * 2`,则字符串中可能包含全角字符。 - 若 `LenB(str) = Len(str)`,则字符串中可能仅包含半角字符。 例如: ```vbscript Function IsFullWidthChar(ch) If LenB(ch) = Len(ch) * 2 Then IsFullWidthChar = True Else IsFullWidthChar = False End If End Function Dim s s = "中" Response.Write IsFullWidthChar(s) ' 返回 True s = "A" Response.Write IsFullWidthChar(s) ' 返回 False ``` 该方法可在 UTF-8 编码环境中用于判断字符是否全角字符。 #### 手动转换编码以避免 `LenB` 的 Unicode 行为 在启用 UTF-8 的环境下,可以通过 `ADODB.Stream` 组件将字符串转换为 ANSI 编码后再使用 `LenB` 进行字节长度计算: ```vbscript Function ToAnsi(str) Dim stream Set stream = CreateObject("ADODB.Stream") stream.Open stream.Type = 2 ' 文本模式 stream.Charset = "utf-8" stream.WriteText str stream.Position = 0 stream.Charset = "gbk" stream.Type = 1 ' 二进制模式 ToAnsi = stream.Read stream.Close End Function Dim s s = "Hello!" s = ToAnsi(s) Response.Write LenB(s) ' 应返回 6 ``` 此方法可确保 `LenB` 函数返回正确的字节长度,适用于需要精确判断全角半角字符字节数的场景。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值