当前位置:2019年全年资料歇后语 > 区位码 >

单片机VB6对汉字的处理

  在DOS时代,拥有一个华丽的汉字菜单几乎是每个高档中文应用程序必须的包装。中文Windows操作系统的出现使得高级开发平台实现全中文的提示和界面非常容易和方便。在一般的应用程序中已经很少需要去专门考虑汉字处理的问题。

  但是在许多工程控制和字符串处理的环境中,汉字字符的处理仍然有别于西文字符的处理,需要加以专门的考虑。

  对汉字处理,VB6主要是提供了一些输入法设置方面的支持。它提供了一个ImeMode属性和ImeStatus函数来确定和设置输入法的状态。而且此属性和方法只在VB6的东亚区版本中有效。

  IMEStatus函数返回一个整数,用来指定当前Windows的输入法(IME)方式。

  可以先用ImeStatus函数来检测当前的输入状态,并用IMEMode来控制其输入状态。

  如Text1.IMEMode=0(预定值)、=1(切换为中文输入)、=2(切换为英文输入)

  对于简体汉字和繁体汉字 IME,只能使用设置 0 到 2。设置 3 到 10 对于汉字系统是无效的。

  VB6功能上对汉字处理的直接支持也仅限于此。对于汉字字符串的处理,VB6并没有提供专门的函数和方法。

  各个版本的VB对汉字字符的长度定义并不相同。在Windows 3.x中,VB3中认为每个汉字的长度为2字节。VB自从32位版本以後,不管中英文字,均以2 bytes来储存,这与中文WinArray5的汉字内核有关。但是VB4以后,VB认为每个汉字的长度为1。这在处理包含汉字的字符串时带来很多的不便。

  由于Len、Left、Mid等字符串函数认为一个汉字和一个西文字符的长度都为1,因此处理汉字字符串时有一定的难度。实现上必须要能把汉字按照两个字符(字节)的形式读出。因此在截取汉字字符串的子串时需特别注意。

  由于汉字处理和汉字字模存储的特殊性,在许多情况下我们希望汉字字符的长度为2,英文字符为1。由于VB5和VB6把一个汉字作为一个字符。因此处理汉字时首先必须能正确判断汉字字符串的长度。

  在VB3或C++里,汉字的 ASCII码均大于零,而VB5和VB6中汉字的ASCII码小于0。因此通过判断一个未知字符的ASCII码就可以判断该字符是否汉字。

  VB6中提供了LenB函数用于字符串中的字节数据。如同在双字节字符集(DBCS)语言中一样,LenB返回的是用于代表字符串的字节数,而不是返回字符串中字符的数量。如为用户自定义类型,LenB返回在内存中的大小。

  对要处理的字符串Str1,必须先使用StrConv函数把ANSI格式的Byte数组转换为字符串,否则直接使用LenB函数得到的结果比实际结果大。

  这里自定义了一个子函数CLen来计算汉字字符串的实际长度。同时还能判断字符串中汉字的实际个数。

  计算机是以编码的方式来处理和使用字符的。西文字符采用一个字节表示,即ASCII码,一般只用七位来表示128个字符,而把最高位用作奇偶校验(或者不用)。我国国标规定汉字用内码表示,内码为两个字节。为了保证中西文兼容,也就是说汉字系统的内码必须同时允许ASCII码和汉字的使用,两者之间不应发生冲突。目前规定每个字节只用七位,若两个字节的最高位均为1,则该字符为汉字。

  国标对汉字字库的结构作了统一规定,即将字库分成若干个区,每个区有Array4个汉字,每个汉字在字库中有确定的区和位,因此每个汉字各有一个区位码,知道了区位码也就相当于知道了汉字在字库中的位置。由于汉字的内码与区位码有一定的关系,所以只要通过汉字的内码就可得到该汉字的区位码,也就得到了该汉字的字模。

  一个16点阵汉字其字模数据共有32字节,可以看作是一条记录,在程序中可以用一个数组存放。在DOS的图形模式下,汉字是通过描点的方法逐点画上去的。读取字模中每个字节的每一位,就能确定汉字中的每个点。故一个16×16点阵的汉字必须要32个字节的字模数据才能确定。

  以下是DOS的图形模式下显示一个16×16点阵汉字时的描点顺序图。每两个字节的字模数据确定一行。

  要对汉字字模进行转换首先应该正确地读出16点阵汉字在字库中的32字节的字模数据。设某一汉字的内码为ddff,其中dd表示区内码,ff表示位内码,则dd-&Ha1为该汉字的区码,ff-&Ha1为该汉字的位码。则该汉字在字库中的位置为:

  需要注意的是,以何种方式从字库文件中读取这32字节也是一个关键问题。由于二进制(Binary)方式访问文件可以直接查看文件中指定的字节,而且二进制方式也是唯一支持用户到文件的任何位置读写任意长度数据的方法。因而以二进制方式打开汉字字库文件是最适合的。

  VB6虽然提供了较强的位运算功能,但是对于在字模转换中使用较多的移位操作,却没有提供对应的移位运算符、指令或函数。其实通过and(与)、or(或)二个位运算符即可编制一个自定义子函数来实现移位运算。

  尤其需要注意的是当把二进制数据写入文件中时,必须使用Byte数据类型的数组变量,而不是 String 变量。 String 被认为包含的是字符,而二进制型数据可能无法正确地存在 String 变量中。

  图形点阵液晶在现代单片机系统中是一种十分常用的显示设备,BP机、手机上的显示屏就是图形点阵液晶。它能显示汉字和图形,与行列式键盘组成了单片机系统中最常用的人机交互界面。但是直接从中文系统汉字字库中提取的汉字字模并不能直接在液晶上显示,通常都必须经过格式上的调整和转换。

  与在西文DOS中显示汉字不同的是,图形点阵液晶并不是简单地用画点的方式来描出汉字。以常用的HD61202图形点阵液晶显示控制模块为例,它能控制 64×64点阵液晶的显示,其显示RAM共64行,分8页,每页8行,每一页的数据寄存器分别对应液晶屏幕上的8行点,对显示RAM的一个字节单位赋值就是对当前列的8行(一页)的像素点是否显示进行控制。连续16列和相邻的2页的32字节显示RAM就可以控制一个汉字的显示区域。对这些显示RAM赋以相应的值就可以显示出一个汉字。

  HD61202图形点阵液晶显示控制模块的汉字字模的排列实际上是标准汉字字模排列形式旋转而成的。对标准汉字字模转换的目的就是在单片机系统的数据存储器中(如E2PROM)存储经过调整的连续32字节的16进制数。

  以下这段程序是放置在汉字源文本输入框(SrcTxt)的Change事件中。通过判断输入在文本框内的字符的ASCII码是否小于零,就能判断输入的字符是不是汉字。这段程序还能计算汉字字符串的长度。同时把输入的汉字存储在一个临时文件TempSrc.txt中。由于这段代码是放在文本框的 Change事件中,它能立即更新汉字个数的显示。

  在实例中选用了UCDOS 5.0汉字系统中的16点阵字库Hzk16作为提取汉字字模的标准字库。

  以上程序在实用中取得了很好的效果。此汉字字模转换程序丰富了单片机系统开发工具的功能,是包含液晶显示功能的单片机系统在系统调试和开发过程中不可或缺的功能模块。

  名称:串口通信 内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源 打开串口调...

  这是一款源程序,程序功能:速成有时钟显示,使用DS18B20进行温度检测,控制温度可通过按键进行设置...

  看门狗是为了防止程序跑飞而设定的,但是由于看门狗是一个类似于定时器,因此可以把他当作定时器来使用 ...

  1、设置svc模式 设置处理器的模式为svc模式,根据ARM架构参考手册,处理器有七种工作模式: 在...

  USB速度慢的原因有以下几种可能: 1、协议问题 全速的USB设备,最大速度12Mb/s,但是如果跑...

  一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是...

  第一步,首先是 I2C 的起始信号,接着跟上首字节,也就是我们前边讲的 I2C 的器件地址,并且在读...

  血糖测量的电生物化学原理是当施加一定电压于经酶反应后的血液产生的电流会随着血液中的血糖浓度的增加而增...

  89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。

  每个人的硬件可能都不一样,(哪些控制数码管的位选,哪些控制数码管的段选,哪些控制独立按键等等),大家...

  中断优先级的内容,有一般紧急的中断,有特别紧急的中断,这取决于具体的系统设计,这就涉及到中断优先级和...

  是人就会犯错,何况是工程师呢?虽然斗转星移,工程师们却经常犯同样的错误!下面,就请各位对号入座,看看...

  使用简单的三态门,即可为单片机扩充串行口,仅仅占用单片机的一、二个引脚作为控制引线

http://mimaximafm.com/quweima/312.html
点击次数:??更新时间2019-06-16??【打印此页】??【关闭
  • Copyright © 2002-2017 DEDECMS. 织梦科技 版权所有  
  • 点击这里给我发消息
在线交流 
客服咨询
【我们的专业】
【效果的保证】
【百度百科】
【因为有我】
【所以精彩】