判断字符是否是GB2312-80的汉字。

简介:

 首先,先介绍GB2312-80编码。参看文章“GB2312编码”。以下内容来自那篇文章。

  GB2312或GB2312-80是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集--基本集》,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于大陆;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持GB2312。

  GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄罗斯语西里尔字母在内的682个全形字符。

  GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖99.75%的使用频率。

  对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。

分区表示
GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。

    01-09区为特殊符号。 
16-55区为一级汉字,按拼音排序。 
56-87区为二级汉字,按部首/笔画排序。 
10-15区及88-94区则未有编码。

    举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。

  字节结构
在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII。

  每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。例如“啊”字在大多数程序中,会以0xB0A1储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。

  在实际的运用中,有时会要求判断一个中文字符是否是GB2312中的中文字符。

  在VB2005中,tB = System.Text.Encoding.GetEncoding("gb18030").GetBytes(S),表示将字符S的内码放到tB这个字节数组里。其中gb18030是向下兼容gb2312。

  于是,编写了一个函数,用来判断字符是否是gb2312的中文字符。用的是VB2005。代码格式修正于2012年1月6日。

  

Public  Function IsGB2312( ByVal S  As  StringAs  Boolean
   If S  Is  Nothing  Then  Return  False
   If S =  ""  Then  Return  False
   If S.Length > 1  Then S = S.Substring(0, 1)
Dim tB()  As  Byte
   Try
    tB = System.Text.Encoding.GetEncoding( "gb18030").GetBytes(S)
If tB.Length = 2  Then
       If tB(0) >= 176  AndAlso tB(0) <= 247  AndAlso tB(1) >= 161  AndAlso tB(1) <= 254  Then
         If tB(0) = 215  AndAlso tB(1) > 249  Then
           Return  False
         Else
           Return  True
         End  If
       Else
         Return  False
       End  If
     Else
       Return  False
     End  If
   Catch
     Return  False
   End  Try
End  Function

   注:在VB2005中,ASC函数也能返回字符的内码,不过返回值是Integer型的。而且由于和早期的VB版本兼容,返回值还进行了一定的处理。早期的VB中Integer用的是2个字节,那么,汉字的内码也是两个字节,这两个字节组成一个Integer型的变量,由于第一个字节的最高位一定是1,所以,早期的VB的汉字的内码是一个小于0的整数。而VB2005的Integer型的变量是4个字节。汉字的内码是两个字节,转到Integer型,填充到后面两个字节,前面两个字节用0填充,这样一来,VB2005的汉字内码应该是一个正数,但为了和早期的兼容,VB2005做了一定的处理,用了一个公式256X+Y-65536来计算汉字的内码,其中X是内码的第一个字节,Y是内码的第二个字节。

 

   本文转自万仓一黍博客园博客,原文链接:http://www.cnblogs.com/grenet/archive/2010/03/26/1696666.html,如需转载请自行联系原作者

相关文章
hutool验证是否为中文字、英文字母、数字和下划线
hutool验证是否为中文字、英文字母、数字和下划线
|
7月前
|
机器学习/深度学习 人工智能 算法
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
本文介绍了如何使用 Python 和 YOLO v8 开发专属的 AI 视觉目标检测模型。首先讲解了 YOLO 的基本概念及其高效精准的特点,接着详细说明了环境搭建步骤,包括安装 Python、PyCharm 和 Ultralytics 库。随后引导读者加载预训练模型进行图片验证,并准备数据集以训练自定义模型。最后,展示了如何验证训练好的模型并提供示例代码。通过本文,你将学会从零开始打造自己的目标检测系统,满足实际场景需求。
5985 0
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
|
10月前
|
网络协议 图形学 Windows
unity获取本机IP地址
在 Unity 中,通过 .NET 框架的 System.Net 命名空间提供的 Dns 和 NetworkInterface 类,可以获取本机的 IPv4 和 IPv6 地址。使用 Dns.GetHostEntry 方法获取主机信息,并根据地址族(AddressFamily.InterNetwork 或 AddressFamily.InterNetworkV6)筛选出相应的 IP 地址。代码示例展示了如何分别获取 IPv4 和 IPv6 地址并输出到控制台。
524 10
|
Java
Java一分钟之-抽象类与接口的应用场景
【5月更文挑战第9天】Java中,抽象类和接口用于实现多态和抽象。抽象类不能实例化,提供部分实现和定义模板;接口包含无实现的抽象方法,用于定义行为规范和解耦合。选择时,关注行为用接口,部分实现用抽象类。注意抽象类的`final`和`static`方法、接口冲突等问题,明确设计目标,适度抽象,遵循接口设计原则,以提高代码质量。
596 1
|
数据可视化 大数据 Linux
OpenEuler虚拟机安装保姆级教程 | 附可视化界面
本文介绍了如何在VMware中安装openEuler操作系统,从选择合适的镜像版本下载开始,到创建虚拟机、配置CPU虚拟化、进行系统安装、设置网络连接,直至安装DDE桌面环境实现图形化操作。openEuler是一款由华为开源的操作系统,支持多种处理器架构,广泛应用于数据库、大数据、云计算等领域。文中还分享了安装过程中的注意事项及解决网络问题的方法,适合初次接触openEuler的用户参考学习。
4944 4
OpenEuler虚拟机安装保姆级教程 | 附可视化界面
|
缓存 编译器 API
聊一聊 C#中有趣的 SourceGenerator生成器
【10月更文挑战第1天】SourceGenerator 是 C# 中的一项强大功能,允许在编译时动态生成源代码,减少手动编写重复代码的工作量,并可在编译时进行优化和错误检查。它与 Roslyn 编译器紧密集成,可根据预定义逻辑生成新代码。应用场景包括自动生成接口实现和优化计算逻辑等。虽然能显著提升生产力和代码一致性,但开发和调试 SourceGenerator 本身较为复杂,维护成本较高。
535 7
|
JSON Java 数据处理
Unity 数据读取|(二)多种方式读取文本文件
Unity 数据读取|(二)多种方式读取文本文件
|
监控 关系型数据库 数据库
如何优化PostgreSQL的性能?
【8月更文挑战第4天】如何优化PostgreSQL的性能?
744 7