怎麽樣在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