大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> Visual Basic 6编程中的汉字处理

Visual Basic 6编程中的汉字处理

时间: 2021-07-31 作者:daque

焦纯 杨国胜 王健琪  在dos期间,具有一个奢侈的中国字菜单简直是每个高等华文运用步调必需的包装。华文windows操纵体例的展示使得高档开拓平台实行全华文的提醒和界面特殊简单和简单。在普遍的运用步调中仍旧很少须要去特意商量中国字处置的题目。  然而在很多工程遏制和字符串处置的情况中,中国字字符的处置仍旧有别于西笔墨符的处置,须要加以特意的商量。  一、vb6对中国字处置的扶助  对中国字处置,vb6主假如供给了少许输出法树立上面的扶助。它供给了一个imemode属性和imestatus因变量来决定和树立输出法的状况。并且此属性和本领只在vb6的东亚区本子中灵验。  imestatus因变量归来一个平头,用来指定暂时windows的输出法(ime)办法。  底下是华文地域的归来值:  常数 值 刻画  vbimenoop 0 不安置ime(缺省)  vbimeon 1 翻开ime  imemode属性归来大概树立被选定的东西的 ime (input method editor,输出本领编纂器)状况。  不妨先用imestatus因变量来检验和测定暂时的输出状况,并用imemode来遏制其输出状况。  如text1.imemode=0(预订值)、=1(切换为华文输出)、=2(切换为英文输出)  对于简体中国字和繁体中国字 ime,只能运用树立 0 到 2。树立 3 到 10 对于中国字体例是失效的。  vb6功效上对中国字处置的径直扶助也仅限于此。对于中国字字符串的处置,vb6并没有供给特意的因变量和本领。  二、决定中国字字符串的长度  各个本子的vb对中国字字符的长度设置并不沟通。在windows 3.x中,vb3中觉得每个中国字的长度为2字节。vb自从32位本子以後,尽管中英笔墨,均以2 bytes来积聚,这与华文win95的中国字内核相关。然而vb4此后,vb觉得每个中国字的长度为1。这在处置包括中国字的字符串时带来很多的未便。  因为len、left、mid等字符串因变量觉得一个中国字和一个西笔墨符的长度都为1,所以处置中国字字符串时有确定的难度。实行上必需要能把中国字依照两个字符(字节)的情势读出。所以在截取中国字字符串的子串时需更加提防。  因为中国字处置和中国字字模保存的特出性,在很多情景下咱们蓄意中国字字符的长度为2,英笔墨符为1。因为vb5和vb6把一个中国字动作一个字符。所以处置中国字时开始必需能精确确定中国字字符串的长度。  在vb3或c++里,中国字的 ascii码均大于零,而vb5和vb6中中国字的ascii码小于0。所以经过确定一个未知字符的ascii码就不妨确定该字符能否中国字。  这边咱们供给了两种本领来确定中国字字符串的长度。  1、本领1  vb6中供给了lenb因变量用来字符串中的字节数据。犹如在双字节字符集(dbcs)谈话中一律,lenb归来的是用来代办字符串的字节数,而不是归来字符串中字符的数目。如为用户自设置典型,lenb归来在外存中的巨细。  lenb(strconv(str1,vbformunicode))  对要处置的字符串str1,必需先运用strconv因变量把ansi方法的byte数组变换为字符串,要不径直运用lenb因变量获得的截止比本质截止大。  2、本领2  这边自设置了一个子因变量clen来计划中国字字符串的本质长度。同声还能确定字符串中中国字的本质个数。  function clen(hzstr$) as integer  static hznum as integer  l = len(hzstr$)  for n=1 to l  if asc(mid$( hzstr$,n,1))<0 then hznum = hznum + 1  next n  clen = l + hznum  end function  clen因变量中的静态变量hznum归来字符串中本质中国字的数量。  三、中国字字模读写和保存的机理  计划机是以源代码的办法来处置和运用字符的。西笔墨符沿用一个字节表白,即ascii码,普遍只用七位来表白128个字符,而把最上位用作奇偶校验(大概不必)。我国国家标准规则中国字用内码表白,内码为两个字节。为了保护中西方文字兼容,也即是说中国字体例的内码必需同声承诺ascii码和中国字的运用,两者之间不应爆发辩论。暂时规则每个字节只用七位,若两个字节的最上位均为1,则该字符为中国字。  国家标准对中国字字库的构造作了一致规则,行将字库分红几何个区,每个区有94个中国字,每个中国字在字库中有决定的区和位,所以每个中国字各有一个区位码,领会了区位码也就十分于领会了中国字在字库中的场所。因为中国字的内码与区位码有确定的联系,以是只有经过中国字的内码就可获得该中国字的区位码,也就获得了该中国字的字模。  搜索一个中国字字模数据的算法为:  中国字内码 -> 区位码 -> 记载号 -> 字模数据  一个16布点中国字其字模数据公有32字节,不妨看作是一条记载,在步调中不妨用一个数组寄存。在dos的图形形式下,中国字是经过描点的本领逐点画上去的。读取字模中每个字节的每一位,就能决定中国字中的每个点。故一个16×16布点的中国字必需要32个字节的字模数据本领决定。  以次是dos的图形形式下表露一个16×16布点中国字时的描点程序图。每两个字节的字模数据决定一条龙。  四、vb6中实行中国字字模变换的本领  在很多工程遏制的运用情况中,常常须要对规范的中国字字模举行安排和变换。  要对中国字字模举行变换开始该当精确地读出16布点中国字在字库中的32字节的字模数据。设某一中国字的内码为ddff,个中dd表白区内码,ff表白位内码,则dd-&ha1为该中国字的区码,ff-&ha1为该中国字的位码。则该中国字在字库中的场所为:  location = [(dd-&ha1)×94 + (ff-&ha1)]×32  须要提防的是,以何种办法从字库文献中读取这32字节也是一个要害题目。因为二进制(binary)办法考察文献不妨径直察看文献中指定的字节,并且二进制办法也是独一扶助用户到文献的任何场所读写大肆长度数据的本领。所以以二进制办法翻开中国字字库文献是最符合的。  vb6固然供给了较强的位演算功效,然而对于在字模变换中运用较多的移位操纵,却没有供给对应的移位演算符、训令或因变量。本来经过and(与)、or(或)二个位演算符即可体例一个自设置子因变量来实行移位演算。  底下的自设置子因变量即是实行轮回右移的:  public function byteright(byte1 as byte, n as integer) as byte '将byte1右移n位  dim temvar as byte '偶尔变量  dim temvar1 as byte '偶尔变量  dim x, y as integer  temvar = byte1  for x = 1 to n '移几何位就轮回几何次  for y = 1 to 8 '从第一位(右边第一位)发端轮回右移  select case y  case 1  if (temvar and &h1) = &h1 then '即使偶尔变量temvar的第一位是1,  temvar1 = &h1 '则将偶尔变量temvar1置1,  else  temvar1 = &h0 '则将偶尔变量temvar1置0,  end if  case 2  if (temvar and &h2) = &h2 then '即使偶尔变量temvar的第二位是1,  temvar = temvar or &h1 '则将其第一场所1(其它位静止),  else  temvar = temvar and &hfe '反之将第一场所0(其它位静止)  end if  case 3  if (temvar and &h4) = &h4 then '操纵与上头沟通  temvar = temvar or &h2  else  temvar = temvar and &hfd  end if  case 4  if (temvar and &h8) = &h8 then  temvar = temvar or &h4  else  temvar = temvar and &hfb  end if  case 5  if (temvar and &h10) = &h10 then  temvar = temvar or &h8  else  temvar = temvar and &hf7  end if  case 6  if (temvar and &h20) = &h20 then  temvar = temvar or &h10  else  temvar = temvar and &hef  end if  case 7  if (temvar and &h40) = &h40 then  temvar = temvar or &h20  else  temvar = temvar and &hdf  end if  case 8  if (temvar and &h80) = &h80 then  temvar = temvar or &h40  else  temvar = temvar and &hbf  end if  if temvar1 = &h1 then '移完第八位后,即使temvar1是1(即第一位是1)  temvar = temvar or &h80 '则将temvar的第八场所1  else  temvar = temvar and &h7f '反之置0  end if  end select  next y  next x  byteright = temvar '将temvar的值归来给因变量名  end function  更加须要提防的是当把二进制数据写入文献中时,必需运用byte数据典型的数组变量,而不是 string 变量。 string 被觉得包括的是字符,而二进制型数据大概没辙精确地生存 string 变量中。  五、一个本质运用案例  图形布点液晶在新颖单片机体例中是一种格外常用的表露摆设,bp机、手机上的表露屏即是图形布点液晶。它能表露中国字和图形,与队伍式键盘构成了单片机体例中最常用的人机交互界面。然而径直从华文体例中国字字库中索取的中国字字模并不许径直在液晶上表露,常常都必需过程方法上的安排和变换。  1、图形布点液晶的中国字字模  与在西方文字dos中表露中国字各别的是,图形布点液晶并不是大略地用画点的办法来描出中国字。以常用的hd61202图形布点液晶表露遏制模块为例,它能遏制64×64布点液晶的表露,其表露ram共64行,分8页,每页8行,每一页的数据存放器辨别对应液晶屏幕上的8行点,对表露ram的一个字节单元赋值即是对当前线的8行(一页)的像素点能否表露举行遏制。贯串16列和相邻的2页的32字节表露ram就不妨遏制一个中国字的表露地区。对那些表露ram赋以相映的值就不妨表露出一个中国字。  hd61202图形布点液晶表露遏制模块的中国字字模的陈设本质上是规范中国字字模陈设情势回旋而成的。对规范中国字字模变换的手段即是在单片机体例的数据保存器中(如e2prom)保存过程安排的贯串32字节的16进制数。  2、本质源步调  以次这段步调是安置在中国字源文本输出框(srctxt)的change事变中。经过确定输出在文本框内的字符的ascii码能否小于零,就能确定输出的字符是否中国字。这段步调还能计划中国字字符串的长度。同声把输出的中国字保存在一个偶尔文献tempsrc.txt中。因为这段代码是放在文本框的change事变中,它能登时革新中国字个数的表露。  private sub srctxt_change( )  static sstr as string  dim i as integer  dim tempfile, tempfilebinary as string  totalnum = 0  l = len(srctxt.text)  for i = 1 to l  tmpstr = strconv(mid$(srctxt.text, i, 1), vbwide)  if asc(mid$(srctxt.text, i, 1)) < 0 then  totalnum = totalnum + 1  sstr = srctxt.text  else  msgbox "写入的不是中国字!"  srctxt.text = left(srctxt.text, len(srctxt.text) - 1)  exit sub  end if  next i  lblnum.caption = str$(totalnum) + "个中国字"  tempfile = app.path + "\" + "tempsrc.txt"  'tempfilebinary = app.path + "\" + "tempsrcbinary.txt"  open tempfile for output as #1  print #1, srctxt.text  close #1  end sub  在范例中采用了ucdos 5.0中国字体例中的16布点字库hzk16动作索取中国字字模的规范字库。  private sub cmdcnt_click( )  dim tempsrcfile as string  dim tempdestfile as string  dim tempfile as string  dim hzfile as string  dim to61202(32) as integer  dim p(1 to 2) as byte  dim c1, c2  dim rec as integer  dim location as long '中国字在字库中的场所  dim hz(0 to 31) as byte '变换完的32字节的字模数据  dim buf1(0 to 31) as byte '暂存变换进程中的32字节字模数据  dim hzall( ) as byte '寄存十足字模数据的动静数组  dim loopall as integer  dim bit, k2, k3 as byte  dim i, j, i1, k, k1, k4, k5, k6 as integer  desttxt.text = "" 'desttxt是目的文本框,寄存变换后的16进制数据  flag = 0  tempdestfile$ = app.path + "\" + "tempdest.txt"  if fileexists(tempdestfile$) then kill tempdestfile 'fileexists是一个查看文献能否生存的自设置因变量  if srctxt.text = "" then '中国字输出框内无中国字则退出  msgbox "没有不妨变换的字模源文献!"  exit sub  end if  hznum = len(srctxt.text) '赢得中国字的个数  redim hzall(0 to hznum * 32 - 1) '从新设置动静数组的上界  open tempfile for output as #1  print #1, srctxt.text  close #1  for loopall = 0 to hznum - 1  open tempfile for binary access read as #1 '按二进制办法翻开  get #1, 2 * loopall + 1, p  close #1  c1 = cstr(p(1)) - &ha1 '区内码  c2 = cstr(p(2)) - &ha1 '位内码  rec = c1 * 94 + c2  location = clng(rec) * 32 + 1 '该中国字在16*16布点字库中字模第一个字节的场所  hzfile = app.path + "\" + "hzk16"  open hzfile for binary access read as #1 '读取该中国字在16布点字库中的原始字模  get #1, location, hz  close #1  '以次是将ucdos字库的保存方法安排为hd61202的典型方法  for j = 0 to 3  if j = 0 then k4 = 14  if j = 1 then k4 = 15  if j = 2 then k4 = 30  if j = 3 then k4 = 31  for k = 0 to 7  bit = &h80  bit = byteright((bit), (k))  for i = 0 to 7  k2 = byteleft(buf1(j * 8 + k), 1) '所有过程是由低位向上位挪动,结果凑成一个字节  k3 = byteright((hz(k4 - i * 2) and bit), 7 - k) '将字节中的某位移到最低位  k3 = k3 and &h1 '樊篱掉其他7位  buf1(j * 8 + k) = k2 or k3  next i  next k  next j  for i1 = 0 to 31 '将安排后的中国字字模再装入原数组  hz(i1) = buf1(i1)  hzall(loopall * 32 + i1) = buf1(i1)  next   next loopall   open tempdestfile for binary access write as #1 '变换截止生存到tempdestfile中  put #1, 1, hzall  close #1  msgbox "ok!"  end sub  之上步调均在华文vb6专科版上调节和测试经过。  之上步调在适用中博得了很好的功效。此中国字字模变换步调充分了单片机体例开拓东西的功效,是包括液晶表露功效的单片机体例在体例调节和测试和开拓进程中不行或缺的功效模块。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.