国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發(fā)教程 > 詳細頁面

Visual Basic 6編程中的漢字處理

Visual Basic 6編程中的漢字處理

更新時間:2022-05-09 文章作者:未知 信息來源:網(wǎng)絡 閱讀次數(shù):

焦純 楊國勝 王健琪

  在DOS時代,擁有一個華麗的漢字菜單幾乎是每個高檔中文應用程序必須的包裝。中文Windows操作系統(tǒng)的出現(xiàn)使得高級開發(fā)平臺實現(xiàn)全中文的提示和界面非常容易和方便。在一般的應用程序中已經(jīng)很少需要去專門考慮漢字處理的問題。

  但是在許多工程控制和字符串處理的環(huán)境中,漢字字符的處理仍然有別于西文字符的處理,需要加以專門的考慮。

  一、VB6對漢字處理的支持

  對漢字處理,VB6主要是提供了一些輸入法設置方面的支持。它提供了一個ImeMode屬性和ImeStatus函數(shù)來確定和設置輸入法的狀態(tài)。而且此屬性和方法只在VB6的東亞區(qū)版本中有效。

  IMEStatus函數(shù)返回一個整數(shù),用來指定當前Windows的輸入法(IME)方式。

  下面是中文地區(qū)的返回值:

  常數(shù) 值 描述

  vbIMENoOP 0 不安裝IME(缺省)

  vbIMEOn 1 打開IME

  ImeMode屬性返回或者設置被選定的對象的 IME (Input Method Editor,輸入方法編輯器)狀態(tài)。

  可以先用ImeStatus函數(shù)來檢測當前的輸入狀態(tài),并用IMEMode來控制其輸入狀態(tài)。

  如Text1.IMEMode=0(預定值)、=1(切換為中文輸入)、=2(切換為英文輸入)

  對于簡體漢字和繁體漢字 IME,只能使用設置 0 到 2。設置 3 到 10 對于漢字系統(tǒng)是無效的。

  VB6功能上對漢字處理的直接支持也僅限于此。對于漢字字符串的處理,VB6并沒有提供專門的函數(shù)和方法。

  二、確定漢字字符串的長度

  各個版本的VB對漢字字符的長度定義并不相同。在Windows 3.x中,VB3中認為每個漢字的長度為2字節(jié)。VB自從32位版本以後,不管中英文字,均以2 bytes來儲存,這與中文Win95的漢字內(nèi)核有關。但是VB4以后,VB認為每個漢字的長度為1。這在處理包含漢字的字符串時帶來很多的不便。

  由于Len、Left、Mid等字符串函數(shù)認為一個漢字和一個西文字符的長度都為1,因此處理漢字字符串時有一定的難度。實現(xiàn)上必須要能把漢字按照兩個字符(字節(jié))的形式讀出。因此在截取漢字字符串的子串時需特別注意。

  由于漢字處理和漢字字模存儲的特殊性,在許多情況下我們希望漢字字符的長度為2,英文字符為1。由于VB5和VB6把一個漢字作為一個字符。因此處理漢字時首先必須能正確判斷漢字字符串的長度。

  在VB3或C++里,漢字的 ASCII碼均大于零,而VB5和VB6中漢字的ASCII碼小于0。因此通過判斷一個未知字符的ASCII碼就可以判斷該字符是否漢字。

  這里我們提供了兩種方法來判斷漢字字符串的長度。

  1、方法1

  VB6中提供了LenB函數(shù)用于字符串中的字節(jié)數(shù)據(jù)。如同在雙字節(jié)字符集(DBCS)語言中一樣,LenB返回的是用于代表字符串的字節(jié)數(shù),而不是返回字符串中字符的數(shù)量。如為用戶自定義類型,LenB返回在內(nèi)存中的大小。

  LenB(StrConv(Str1,vbFormUnicode))

  對要處理的字符串Str1,必須先使用StrConv函數(shù)把ANSI格式的Byte數(shù)組轉換為字符串,否則直接使用LenB函數(shù)得到的結果比實際結果大。

  2、方法2

  這里自定義了一個子函數(shù)CLen來計算漢字字符串的實際長度。同時還能判斷字符串中漢字的實際個數(shù)。

  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函數(shù)中的靜態(tài)變量HzNum返回字符串中實際漢字的數(shù)目。

  三、漢字字模讀寫和存儲的機理

  計算機是以編碼的方式來處理和使用字符的。西文字符采用一個字節(jié)表示,即ASCII碼,一般只用七位來表示128個字符,而把最高位用作奇偶校驗(或者不用)。我國國標規(guī)定漢字用內(nèi)碼表示,內(nèi)碼為兩個字節(jié)。為了保證中西文兼容,也就是說漢字系統(tǒng)的內(nèi)碼必須同時允許ASCII碼和漢字的使用,兩者之間不應發(fā)生沖突。目前規(guī)定每個字節(jié)只用七位,若兩個字節(jié)的最高位均為1,則該字符為漢字。

  國標對漢字字庫的結構作了統(tǒng)一規(guī)定,即將字庫分成若干個區(qū),每個區(qū)有94個漢字,每個漢字在字庫中有確定的區(qū)和位,因此每個漢字各有一個區(qū)位碼,知道了區(qū)位碼也就相當于知道了漢字在字庫中的位置。由于漢字的內(nèi)碼與區(qū)位碼有一定的關系,所以只要通過漢字的內(nèi)碼就可得到該漢字的區(qū)位碼,也就得到了該漢字的字模。

  查找一個漢字字模數(shù)據(jù)的算法為:

  漢字內(nèi)碼 -> 區(qū)位碼 -> 記錄號 -> 字模數(shù)據(jù)

  一個16點陣漢字其字模數(shù)據(jù)共有32字節(jié),可以看作是一條記錄,在程序中可以用一個數(shù)組存放。在DOS的圖形模式下,漢字是通過描點的方法逐點畫上去的。讀取字模中每個字節(jié)的每一位,就能確定漢字中的每個點。故一個16×16點陣的漢字必須要32個字節(jié)的字模數(shù)據(jù)才能確定。

  以下是DOS的圖形模式下顯示一個16×16點陣漢字時的描點順序圖。每兩個字節(jié)的字模數(shù)據(jù)確定一行。

  四、VB6中實現(xiàn)漢字字模轉換的技巧

  在許多工程控制的應用環(huán)境中,經(jīng)常需要對標準的漢字字模進行調整和轉換。

  要對漢字字模進行轉換首先應該正確地讀出16點陣漢字在字庫中的32字節(jié)的字模數(shù)據(jù)。設某一漢字的內(nèi)碼為ddff,其中dd表示區(qū)內(nèi)碼,ff表示位內(nèi)碼,則dd-&Ha1為該漢字的區(qū)碼,ff-&Ha1為該漢字的位碼。則該漢字在字庫中的位置為:

  Location = [(dd-&Ha1)×94 + (ff-&Ha1)]×32

  需要注意的是,以何種方式從字庫文件中讀取這32字節(jié)也是一個關鍵問題。由于二進制(Binary)方式訪問文件可以直接查看文件中指定的字節(jié),而且二進制方式也是唯一支持用戶到文件的任何位置讀寫任意長度數(shù)據(jù)的方法。因而以二進制方式打開漢字字庫文件是最適合的。

  VB6雖然提供了較強的位運算功能,但是對于在字模轉換中使用較多的移位操作,卻沒有提供對應的移位運算符、指令或函數(shù)。其實通過and(與)、or(或)二個位運算符即可編制一個自定義子函數(shù)來實現(xiàn)移位運算。

  下面的自定義子函數(shù)就是實現(xiàn)循環(huán)右移的:

  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 '移多少位就循環(huán)多少次

  For Y = 1 To 8 '從第一位(右邊第一位)開始循環(huán)右移

  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的值返回給函數(shù)名

  End Function

  尤其需要注意的是當把二進制數(shù)據(jù)寫入文件中時,必須使用Byte數(shù)據(jù)類型的數(shù)組變量,而不是 String 變量。 String 被認為包含的是字符,而二進制型數(shù)據(jù)可能無法正確地存在 String 變量中。

  五、一個實際應用案例

  圖形點陣液晶在現(xiàn)代單片機系統(tǒng)中是一種十分常用的顯示設備,BP機、手機上的顯示屏就是圖形點陣液晶。它能顯示漢字和圖形,與行列式鍵盤組成了單片機系統(tǒng)中最常用的人機交互界面。但是直接從中文系統(tǒng)漢字字庫中提取的漢字字模并不能直接在液晶上顯示,通常都必須經(jīng)過格式上的調整和轉換。

  1、圖形點陣液晶的漢字字模

  與在西文DOS中顯示漢字不同的是,圖形點陣液晶并不是簡單地用畫點的方式來描出漢字。以常用的HD61202圖形點陣液晶顯示控制模塊為例,它能控制64×64點陣液晶的顯示,其顯示RAM共64行,分8頁,每頁8行,每一頁的數(shù)據(jù)寄存器分別對應液晶屏幕上的8行點,對顯示RAM的一個字節(jié)單位賦值就是對當前列的8行(一頁)的像素點是否顯示進行控制。連續(xù)16列和相鄰的2頁的32字節(jié)顯示RAM就可以控制一個漢字的顯示區(qū)域。對這些顯示RAM賦以相應的值就可以顯示出一個漢字。

  HD61202圖形點陣液晶顯示控制模塊的漢字字模的排列實際上是標準漢字字模排列形式旋轉而成的。對標準漢字字模轉換的目的就是在單片機系統(tǒng)的數(shù)據(jù)存儲器中(如E2PROM)存儲經(jīng)過調整的連續(xù)32字節(jié)的16進制數(shù)。

  2、實際源程序

  以下這段程序是放置在漢字源文本輸入框(SrcTxt)的Change事件中。通過判斷輸入在文本框內(nèi)的字符的ASCII碼是否小于零,就能判斷輸入的字符是不是漢字。這段程序還能計算漢字字符串的長度。同時把輸入的漢字存儲在一個臨時文件TempSrc.txt中。由于這段代碼是放在文本框的Change事件中,它能立即更新漢字個數(shù)的顯示。

  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漢字系統(tǒng)中的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字節(jié)的字模數(shù)據(jù)

  Dim Buf1(0 To 31) As Byte '暫存轉換過程中的32字節(jié)字模數(shù)據(jù)

  Dim HzAll( ) As Byte '存放全部字模數(shù)據(jù)的動態(tài)數(shù)組

  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進制數(shù)據(jù)

  Flag = 0

  TempDestFile$ = App.Path + "\" + "TempDest.txt"

  If FileExists(TempDestFile$) Then Kill TempDestFile 'FileExists是一個檢查文件是否存在的自定義函數(shù)

  If SrcTxt.Text = "" Then '漢字輸入框內(nèi)無漢字則退出

  MsgBox "沒有可以轉換的字模源文件!"

  Exit Sub

  End If

  HzNum = Len(SrcTxt.Text) '獲得漢字的個數(shù)

  ReDim HzAll(0 To HzNum * 32 - 1) '重新定義動態(tài)數(shù)組的上界

  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 '區(qū)內(nèi)碼

  C2 = CStr(p(2)) - &Ha1 '位內(nèi)碼

  rec = C1 * 94 + C2

  Location = CLng(rec) * 32 + 1 '該漢字在16*16點陣字庫中字模第一個字節(jié)的位置

  HzFile = App.Path + "\" + "hzk16"

  Open HzFile For Binary Access Read As #1 '讀取該漢字在16點陣字庫中的原始字模

  Get #1, Location, Hz

  Close #1

  '以下是將UCDOS字庫的存儲格式調整為HD61202的規(guī)范格式

  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) '整個流程是由低位向高位移動,最后湊成一個字節(jié)

  k3 = byteRight((Hz(k4 - i * 2) And bit), 7 - k) '將字節(jié)中的某位移到最低位

  k3 = k3 And &H1 '屏蔽掉其余7位

  Buf1(j * 8 + k) = k2 Or k3

  Next i

  Next k

  Next j

  For i1 = 0 To 31 '將調整后的漢字字模再裝入原數(shù)組

  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專業(yè)版上調試通過。

  以上程序在實用中取得了很好的效果。此漢字字模轉換程序豐富了單片機系統(tǒng)開發(fā)工具的功能,是包含液晶顯示功能的單片機系統(tǒng)在系統(tǒng)調試和開發(fā)過程中不可或缺的功能模塊。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        精品夜夜嗨av一区二区三区| 91麻豆精东视频| 日本网站在线观看一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 精品美女一区二区三区| 国产乱码一区二区三区| 国产精品久久久久久久蜜臀| 成人午夜精品一区二区三区| 久久久99精品久久| 久久成人av少妇免费| 欧美福利视频一区| 免费久久精品视频| 国产精品午夜在线| 狠狠色狠狠色综合| 国产亚洲欧洲一区高清在线观看| av电影一区二区| 一区二区三区日韩在线观看| 91精品国产欧美一区二区| 高清国产午夜精品久久久久久| 国产精品色哟哟| 欧美午夜不卡在线观看免费| 亚洲图片一区二区| 日韩欧美一级在线播放| 国产美女一区二区三区| 国产精品国产三级国产普通话蜜臀| 91在线视频在线| 日本aⅴ免费视频一区二区三区| 91精选在线观看| 精久久久久久久久久久| 亚洲精品欧美二区三区中文字幕| 欧美成va人片在线观看| 欧美丝袜自拍制服另类| 精品一区二区日韩| 亚洲一区二区精品3399| 国产精品国产精品国产专区不蜜| 欧美一级二级三级乱码| 91蝌蚪porny| 高清在线观看日韩| 激情综合色丁香一区二区| 一区二区高清在线| 国产精品理伦片| 精品不卡在线视频| 91超碰这里只有精品国产| 日本高清不卡视频| 波多野结衣中文字幕一区| 免费精品视频最新在线| 亚洲国产另类av| 国产精品久久久久毛片软件| 欧美日韩国产首页在线观看| 99久久er热在这里只有精品66| 亚洲欧洲性图库| 久久嫩草精品久久久精品| 欧美日韩国产片| 欧美午夜一区二区三区免费大片| www.亚洲色图.com| 色综合久久久网| aaa亚洲精品| 中文字幕精品在线不卡| 欧美少妇一区二区| 国产一区在线视频| 久久成人av少妇免费| 日韩制服丝袜先锋影音| 国产精品免费av| 中文字幕一区二| 国产欧美一区二区三区在线老狼| 欧美tk—视频vk| 久久久国产综合精品女国产盗摄| 亚洲精品在线电影| 久久精品一区八戒影视| 欧美韩国日本不卡| 2021中文字幕一区亚洲| 欧美日韩免费一区二区三区| 国产不卡高清在线观看视频| 狠狠色丁香婷综合久久| 一区二区三区精品在线观看| 亚洲精品国产视频| 亚洲h在线观看| 日本女优在线视频一区二区| 午夜不卡av免费| 精品一区二区日韩| 91丨porny丨首页| 色嗨嗨av一区二区三区| 欧美老肥妇做.爰bbww视频| 日韩视频一区二区| 精品少妇一区二区三区视频免付费| 国产日韩欧美a| 亚洲h动漫在线| 国产精品白丝jk黑袜喷水| 91视视频在线观看入口直接观看www | 国产精品久久网站| 亚洲视频一区在线观看| 亚洲3atv精品一区二区三区| 免费高清不卡av| 成人app软件下载大全免费| 一本色道久久综合狠狠躁的推荐| 欧美美女网站色| 亚洲欧洲日产国产综合网| 亚洲成在线观看| 国产成人精品aa毛片| 欧美人与z0zoxxxx视频| 中国色在线观看另类| 日韩1区2区3区| 一本一本大道香蕉久在线精品| 欧美一二区视频| 一区二区视频在线| 国产一区免费电影| 欧美绝品在线观看成人午夜影视| 亚洲欧洲国产专区| 极品美女销魂一区二区三区| 在线精品观看国产| 中文字幕一区二区三区视频| 蜜桃av一区二区在线观看| 91福利视频久久久久| 中文字幕一区二区三区乱码在线 | 国产麻豆视频一区| 欧美日本高清视频在线观看| ...中文天堂在线一区| 韩国在线一区二区| 678五月天丁香亚洲综合网| 成人欧美一区二区三区视频网页 | 欧洲亚洲精品在线| 国产精品久久久久婷婷二区次| 麻豆精品国产传媒mv男同| 欧美日韩一区二区在线观看| 中文字幕在线不卡国产视频| 国产成人免费9x9x人网站视频| 国产精品三级电影| 国产乱人伦偷精品视频免下载 | 91在线看国产| 亚洲国产成人一区二区三区| 精东粉嫩av免费一区二区三区| 91精品国产综合久久精品 | 日韩av高清在线观看| 欧美在线免费观看视频| 亚洲女同ⅹxx女同tv| 色婷婷狠狠综合| 一区二区在线观看不卡| 色婷婷综合久久久久中文一区二区 | 男女男精品网站| 欧美一区二区美女| 国模大尺度一区二区三区| 久久久久久久久久久99999| 国产呦萝稀缺另类资源| 久久久久久综合| 成人国产精品免费网站| 亚洲欧洲日韩综合一区二区| 91天堂素人约啪| 午夜欧美一区二区三区在线播放| 欧美日韩中文国产| 免费在线观看一区二区三区| 日韩一区二区免费电影| 国产精品夜夜爽| 日韩美女啊v在线免费观看| 色综合久久久久网| 日本不卡的三区四区五区| 精品国产污网站| 91视频国产观看| 视频一区二区中文字幕| 精品精品国产高清a毛片牛牛 | 午夜精品影院在线观看| 777xxx欧美| 成人妖精视频yjsp地址| 亚洲一区二区三区四区不卡| 5858s免费视频成人| 久久99精品久久久久久国产越南| 国产清纯美女被跳蛋高潮一区二区久久w| 国产精品麻豆一区二区| 欧美又粗又大又爽| 久久99精品久久久| 亚洲欧美视频在线观看视频| 欧美一区二区三区四区在线观看| 国产aⅴ精品一区二区三区色成熟| 亚洲自拍偷拍麻豆| 日韩欧美国产1| 91看片淫黄大片一级在线观看| 另类专区欧美蜜桃臀第一页| 中文字幕国产一区| 9191成人精品久久| 色又黄又爽网站www久久| 久久国产精品一区二区| 亚洲人精品午夜| 久久久久国产精品人| 欧美日韩专区在线| www.亚洲免费av| 国内精品久久久久影院薰衣草| 一区二区三区在线播| 国产欧美一区二区精品性色| 欧美伦理电影网| 欧美亚洲动漫精品| 91网站视频在线观看| 国产一区二区三区| 免费日韩伦理电影| 亚洲一区二区三区激情| 亚洲成av人片| 亚洲视频免费看| 亚洲欧美综合在线精品| 久久美女高清视频| 精品国产乱码久久久久久久 | 精品国产乱码久久久久久闺蜜| 色狠狠一区二区|