怎么样在excel中批量把汉字姓名转换为区位码?
不知道这阿行!~
每年一度的全国普通高等学校招生报名过程中,考生都要填写报名信息卡,全体同学很紧张地查阅自己姓名中每个汉字对应的国际区位码,往往填卡时间都很紧,全班同学都抢一本区位码手册。笔者编写了一个VFP小程序,利用学校的学生信息数据库表G97.DBF,新增加区位码字段(字符型,16位),运行该程序即刻看到新增加区位码字段已经填好了,再将学号、姓名、区位码三个字段一起打印出来,用起来十分方便。
每个汉字编码方案对应有一个汉字转换程序,把它们转换成统一的机内码(即ASC码),将接收来的两个字节(国标码)在最高位加“1”,即得到内码。
国际区位码+2020H=国标码,国标码+8080H=内码,所以,国际区位码=内码-A0A0H。
每个汉字由两个字节构成,国际区位码的区码可以通过函数substr( )取汉字的前一字节(即前半个汉字)的ASC码减去160(A0H)得到,位码可以通过取汉字的后一字节的ASC码减去160(A0H)得到,如:“重”字区位码为1702,“重”字前后字节的ASC码分别为177和162,区码为 177-160=17,位码为 162-160=2。
程序由两层循环构成,外层循环从G97.DBF文件中逐条取记录,并用replace with替换命令填写“区位码”字段,内层循环逐字求出“姓名”字段的区位码,由if - endif判断语句去除“姓名”字段中的单字节字符。该程序由VFP6.0编制,做适当修改可以变为FoxBASE+程序。
*转换区位码程序清单
*创建并定义单文档窗口wn1,作为信息提示界面
define window win1 from 1,1 to 30,90 font ′楷体′,14;
style ′B′title ′信息窗口′ panel close nofloat grow nominimize zoom color b/gr+
*显示自定义窗口wn1
show window win1
*激活自定义窗口wn1
activate window win1
*打开数据库...并在窗口wn1中给出提示
if!DBUSED(〃G97〃)
set talk off
@4,4 say〃Now, the G97.DBF is being changed! 〃
@8,5 say〃Changed〃
@8,14 say〃.....〃
USE 〃D:\FOX\G97.DBF〃
&&数据库名及位置可自己调整
ENDIF
*统计当前数据库表中记录总数
n=reccount()
i=1 &&变量i是表记录循环的循环变量
do while i〈=n
@8,22 say i
qwma=〃 〃
&&记录i的〃姓名〃字段的区位码变量qwma初始化
go i
xm=TRIM(姓名)
&&去掉〃姓名〃字段的尾部空格
sL=len(xm) &&计算〃姓名〃字段的长度
j=1
do while j〈=sL
*连续取单字节子串b1,b2
b1=substr(xm,j,1)
b2=substr(xm,j+1,1)
*取子串b1,b2的机内码(即ASC码)
num1=asc(b1)
num2=asc(b2)
*判断是否为全角字符(汉字),是则计算出区码qum和位码weim
if (num1〉160) and (num2〉160) and (j〈sL)
qum=num1-160
weim=num2-160
*将区位码存入变量qwma,对qum〈10(weim〈10)情况
*数字前添0,如〃8〃变为〃08〃
do case
case(qum〉9) and (weim〉9)
qwma=qwma+〃 〃+str(qum,2)+str(weim,2)
case(qum〉9) and (weim〈=9)
qwma=qwma+〃 〃+str(qum,2)+〃0〃+str(weim,1)
case(qum〈=9) and (weim〉9)
qwma=qwma+〃 〃+〃0〃+str(qum,1)+str(weim,2)
case (qum〈=9) and (weim〈=9)
qwma=qwma+〃 〃+〃0〃+str(qum,1)+〃0〃+str(weim,1)
endcase
j=j+1 &&字节循环变量增1
endif
j=j+1 &&字节循环变量增1
enddo
replace 区位码 with qwma
&&将该记录〃区位码〃字段替换为区位码qwma
i=i+1&&下一记录
enddo
wait〃按任意键...下一步浏览或修改数据〃 window at 30,10 timeout 15
zoom window win1 max &&使窗口wn1最大化
browse &&查看数据库表
release window win1
use
return