如何随机生成指定数目的国标汉字?


  为了使每一个汉字有一个全国统一的代码,1980年,我国颁布了第一个汉字编码的国家标准: GB2312-80《信息交换用汉字编码字符集》基本集,这个字符集是我国中文信息处理技术的发展基础,也是目前国内所有汉字系统的统一标准。由于国标码是四位十六进制,为了便于交流,大家常用的是四位十进制的区位码。所有的国标汉字与符号组成一个94×94的矩阵。在此方阵中,每一行称为一个"区",每一列称为一个"位",因此,这个方阵实际上组成了一个有94个区(区号分别为0 1到94)、每个区内有94个位(位号分别为01到94)的汉字字符集。一个汉字所在的区号和位号简单地组合在一起就构成了该汉字的"区位码"。在汉字的区位码中,高两位为区号,低两位为位号。 在区位码中,01-09区为682个特殊字符,16~87区为汉字区,包含6763个汉字 。其中16-55区为一级汉字(3755个最常用的汉字,按拼音字母的次序排列),56-87区为二级汉字(3008个汉字,按部首次序排列)。

所以,当我们需要n个任意汉字时,我们不必建一个全部汉字表,而是利用区位码实现常用汉字的提取。

下面的代码可以实现任意数目汉字的生成:

Private Sub getrndhanzi(ByVal n As Integer)
Dim s() As String, i As Integer
Dim temp1 As Integer, temp2 As Integer
ReDim s(1 To n)
Randomize
For i = 1 To n
temp1 = 16 + Int(Rnd * 72)
If temp1 = 55 Then
temp2 = Int(Rnd * 90) '一级汉字从1601-1694,1701-1794,.....5401-5494,5501-5589,共94*40-5=3755 个汉字
Else
temp2 = Int(Rnd * 95) '二级汉字从5601-5694,5701-5794,.....8601-8694,8701-8794,共94*32=3008 个汉字
End If
s(i) = Chr("&H" & Hex(temp1 + 160) & Hex(temp2 + 160))
Next
Debug.Print Join(s, "")'输出
End Sub

Private Sub Command1_Click()
Dim i As Integer
For i = 1 To 25 '分别生成1-25个任意汉字
getrndhanzi i
Next
End Sub

输出:


夫敞
途罨椽
涅搦侄铽
榨藸禒艟球
枵舟斟盯滩桫
狲暗田苫撂蕾岢
冠澧炫鲼噘惺馘柘
巧愁炔哔臆策籼锭昏
紶假媪慈乘嘎肤景濡薤
呋刨锺灰榉懋唇弱献囟垤
均耋撤阗驿迩愍殒埚砸宕薅
蒹翦俄形碌哧烀爝懒缭嫔捭浑
瑾砜疬哜遒濂勾彐綘珩苓就萌炳
光椁旖趁鲲頎壕狁媪暑额忾帷淤黹
湫熏裤降旺廓淳傻蜕脬荪色注紫劾吾
陶沥瑗骶埴于喃刮瘿突赅斛简铨觞抨唼
格鸽乜衍夙菀鲡败陆褐哙苑滓淆踵讫头绑
德泠婷岙湔池桨郅峁汩卒控诉刍镗椎鬣越嫉
义懂聂其定鳓脯膪巯吐昏罚返抖陵沌戗喘茺缂
废雾旯浠疼赃勋妓鳟埏帮盂蕹朐裂祆膻拌脎威纯
宛免作绣稞涑枭搬怿旦熨呈弃驰翔聚饰栩燧艴氢贫
豕源髑乍蚍夏己履毕芤毁篑子褊崖坏忑霉钿瘢驵迁裨
獬纷胚桨衫蹒疯祧武琢吣酃踱免逘浊顸坐磬挫郐婶缪锰
拽技薯帙陕槲逗蜱嘧雌怙诖椭踉盔锍认致暝榴蘖逆捻螨噬

附:

汉字与区位码转换代码:

Function quwei(ByVal x As String) As String '获得某汉字或字符对应的的区位码
If Asc(x) >= 0 Then Exit Function
x = Hex(Asc(x))
quwei = Format(CDec("&H" & Left(x, 2)) - 160, "00") & Format(CDec("&H" & Right(x, 2)) - 160, "00")
End Function


Function hanzi(ByVal x As String) As String'获得某区位码对应汉字或字符
hanzi = Chr("&H" & Hex(Val(Left(x, 2)) + 160) & Hex(Val(Right(x, 2)) + 160))
End Function

原文地址:https://www.cnblogs.com/fengju/p/6336384.html