📄 olehanzi.prg
字号:
#define CRLF CHR(13)+CHR(10)
define class HanZi as session olepublic
About= "【汉字拼音与笔划查询、排序COM服务程序】"+CRLF+;
"作者:郑建标 Email:zhengjianbiao@163.net"+CRLF+;
"版本:1.0 2002年10月 用VFP7.0编写"
Datasession=2 &&设置私有工作期
FUNCTION PinYin(Hanzi as String,JustFirst as Boolean)
*功能:获取为汉字拼音编码
*入口参数:HanZi:汉字字符串
* JustFirst:真,只要拼音首字母;假或默认,要全拼。
*返回:汉字拼音串,之间以空格隔开,若为拼音首字母,则无空格隔开。字符串中的非汉字字符,为原样返回。
LOCAL cl,p
PRIVATE s,cuo,sp
*cl=SET("collate") &&保存当前排序方式
SET COLLATE TO "PINYIN" &&设置按拼音排序方式
*系统有部分汉字的排列是错误的,要特殊处理
cuo=[闯c,囱c,呐n,内n,属s,嗽s,她t,嗅x,丨s,丶d,]+;
[讷n,诶e,呒m,囝n,圜h,澶c,娈l,骣c,赕d,腌a,]+;
[膪c,焘t,恁n,铫d,蛑m,蝥m,跫q,隹c,瞿q,銎q,]
cuo=IIF(JustFirst,cuo,;
[闯chuang,囱cong,呐na,内nei,属shu,嗽sou,她ta,嗅xiu,丨shu,丶dian,]+;
[讷ne,诶ei,呒m,囝nan,圜huan,澶chan,娈luan,骣chan,赕dan,腌a,]+;
[膪chuai,焘tao,恁nen,铫diao,蛑mou,蝥mou,跫qiong,隹cui,瞿qu,銎qiong,])
*若只要拼音首字母,则用这个
s=[ ,吖a,八b,嚓c,咑d,妸e,发f,旮g,铪h,丌j,咔k,垃l,妈m,拿n,]+;
[噢o,趴p,七q,呥r,仨s,他t,哇w,夕x,丫y,匝z]
*若要全拼音,则用这个
s=IIF(JustFirst,s,;
[***,吖a,哎ai,安an,肮ang,凹ao,八ba,掰bai,扳ban,邦bang,包bao,]+;
[陂bei,奔ben,伻beng,偪bi,边bian,杓biao,憋bie,邠bin,氷bing,拨bo,]+;
[庯bu,嚓ca,偲cai,参can,仓cang,操cao,冊ce,岑cen,噌ceng,叉cha,]+;
[拆chai,觇chan,伥chang,抄chao,车che,抻chen,柽cheng,吃chi,充chong,抽chou,]+;
[出chu,搋chuai,川chuan,疮chuang,吹chui,春chun,踔chuo,呲ci,从cong,凑cou,]+;
[粗cu,汆cuan,崔cui,村cun,搓cuo,咑da,呆dai,丹dan,当dang,刀dao,]+;
[得de,灯deng,低di,嗲dia,敁dian,刁diao,爹die,丁ding,丢diu,东dong,]+;
[都dou,嘟du,端duan,堆dui,吨dun,多duo,妸e,恩en,儿er,发fa,]+;
[帆fan,方fang,飞fei,分fen,丰feng,佛fo,缶fou,夫fu,旮ga,侅gai,]+;
[干gan,冈gang,皋gao,戈ge,给gei,根gen,更geng,工gong,勾gou,估gu,]+;
[瓜gua,乖guai,关guan,光guang,归gui,衮gun,呙guo,铪ha,嗨hai,佄han,]+;
[夯hang,蒿hao,诃he,黑hei,拫hen,亨heng,叿hong,侯hou,乎hu,花hua,]+;
[怀huai,欢huan,肓huang,灰hui,昏hun,吙huo,丌ji,加jia,戋jian,江jiang,]+;
[艽jiao,阶jie,巾jin,京jing,冂jiong,勼jiu,匊ju,姢juan,噘jue,军jun,]+;
[咔ka,开kai,刊kan,忼kang,尻kao,坷ke,肯ken,吭keng,空kong,抠kou,]+;
[刳ku,夸kua,蒯kuai,宽kuan,匡kuang,亏kui,坤kun,扩kuo,垃la,来lai,]+;
[兰lan,啷lang,捞lao,仂le,雷lei,塄leng,厘li,俩lia,嫾lian,良liang,]+;
[辽liao,咧lie,邻lin,拎ling,溜liu,咯lo,龙long,娄lou,露lu,驴lv,]+;
[孪luan,掠lve,抡lun,捋luo,呣m,妈ma,埋mai,颟man,牤mang,猫mao,]+;
[庅me,没mei,椚men,氓meng,咪mi,眠mian,喵miao,乜mie,民min,名ming,]+;
[谬miu,摸mo,哞mou,母mu,拿na,乃nai,囡nan,囔nang,孬nao,呢ne,]+;
[娞nei,嫩nen,能neng,嗯ng,妮ni,拈nian,娘niang,鸟niao,捏nie,您nin,]+;
[宁ning,妞niu,农nong,槈nou,奴nu,女nv,疟nve,暖nuan,挪nuo,噢o,]+;
[讴ou,趴pa,拍pai,畨pan,乓pang,抛pao,呸pei,喷pen,怦peng,丕pi,]+;
[片pian,剽piao,氕pie,姘pin,乒ping,钋po,剖pou,仆pu,七qi,掐qia,]+;
[千qian,呛qiang,悄qiao,切qie,亲qin,青qing,跫qiong,丘qiu,区qu,悛quan,]+;
[炔que,囷qun,呥ran,儴rang,荛rao,惹re,人ren,扔reng,日ri,戎rong,]+;
[柔rou,如ru,阮ruan,蕤rui,闰run,挼ruo,仨sa,愢sai,三san,桒sang,]+;
[掻sao,色se,森sen,僧seng,杀sha,筛shai,山shan,伤shang,弰shao,奢she,]+;
[申shen,升sheng,尸shi,収shou,书shu,刷shua,衰shuai,闩shuan,双shuang,谁shui,]+;
[吮shun,说shuo,厶si,忪song,捜sou,苏su,狻suan,虽sui,孙sun,唆suo,]+;
[他ta,囼tai,坍tan,汤tang,涛tao,忑te,疼teng,剔ti,天tian,佻tiao,]+;
[贴tie,厅ting,炵tong,偷tou,凸tu,湍tuan,推tui,吞tun,乇tuo,哇wa,]+;
[歪wai,弯wan,尣wang,危wei,温wen,翁weng,挝wo,乌wu,夕xi,呷xia,]+;
[仙xian,乡xiang,枭xiao,些xie,忄xin,兴xing,凶xiong,休xiu,戌xu,轩xuan,]+;
[靴xue,勋xun,丫ya,咽yan,央yang,幺yao,倻ye,一yi,囙yin,应ying,]+;
[哟yo,佣yong,优you,纡yu,鸢yuan,曰yue,煴yun,帀,匝za,災zai,]+;
[糌zan,赃zang,傮zao,啫ze,贼zei,怎zen,曽zeng,吒zha,斋zhai,沾zhan,]+;
[张zhang,佋zhao,蜇zhe,贞zhen,争zheng,之zhi,中zhong,州zhou,朱zhu,抓zhua,]+;
[拽zhuai,专zhuan,妆zhuang,隹zhui,迍zhun,卓zhuo,仔zi,宗zong,邹zou,租zu,]+;
[躜zuan,樶zui,尊zun,昨zuo])
sp=IIF(JustFirst,""," ") &&分隔符:全拼用空格,首字母连着
RETURN this.pybh(HanZi)
FUNCTION Stroke(HanZi as String)
*功能:获取汉字的笔划数
*入口参数:HanZi: 汉字字符串
*返回:笔划字符串,每个字的笔划数转变为字符型,之间用空格隔开,字符串中的非汉字字符,为原样返回。
PRIVATE s,cuo,sp
SET COLLATE TO "stroke" &&设置按笔划排序方式
cuo=""
sp=" "
s="!0,一1,丁2,万3,不4,且5,乔6,丣7,並8,郎9,丵10,乾11,"+;
"喷12,亂13,僊14,僵15,儐16,償17,儭18,儳19,儶20,儷21,"+;
"儻22,儽23,儾24,囔25,圞26,灥27,囖28,纞29,厵30,灩31"
RETURN THIS.PYBH(HanZi)
PROTECTED FUNCTION pybh(HanZi as String)
*功能:由PinYin()与Stroke()内部调用的公共函数,完成拼音或笔划的获取
*入口参数:HanZi:汉字字符串,由主程序直接传入
* S,CUO,SP:由主程序以私有变量传入
* S:每种拼音或笔划的第一个汉字组成的字符串
* CUO:本来是错误的,列出正确的
* SP:每个汉字编码之间的间隔
LOCAL I,HZ,P1,a,p
p=''
s=strt(s,",",CRLF) &&逗号都变回车
ALINES(py,s,.t.) &&把字符串变为数组
FOR I=1 TO LENC(HanZi) &&依次查找每个汉字或字符
hz=SUBSTRC(HanZi,I,1) &&依次取一个汉字或字符
IF LEN(HZ)=1 &&若是字符,原字符返回
P=P+HZ
LOOP
ENDIF
a=AT_C(hz,cuo)
IF a>0 &&如果是错误中的一个
p1=SUBSTRC(cuo,a+1,AT(",",SUBSTRC(cuo,a+2)))
p=p+p1+sp
LOOP
ENDIF
AINS(py,1)
py(1)=hz+"zz" &&把字插入到数组中一起
ASORT(py) &&一起排序
n=ASCAN(py,hz+"zz") &&找自己
p1=SUBSTR(py(n-1),3) &&排在自己前面的一个就是
ADEL(py,n) &&再把自己删除
p=p+p1+sp
next
RETURN P
FUNCTION Sort(HanZiSource as String,Mode as Integer)
*对多行文本进行排序
*HanZiSource:需要排序的字符串
* 多行:由回车换行隔开的行,按行排序(最多65000行)
* 单行:按字排序的单行文本(最多65000字)
*Mode:排序方式,为3个数字相加
* 0:按ASCII码排序,1:按拼音排序,2:按笔划排序
* 0:正序(小到大),4:逆序(大到小)
* 0:多行文本,8:多行文本的文件名,16:单行文本
*返回:排序好的字符串,以回车换行隔开
LOCAL X(1),I,P,nSortOrder
SET COLLATE TO IIF(Mode%4=0,"MACHINE",;
IIF(Mode%4=1,"PINYIN","STROKE"))
IF Mode>16 &&单行文本
LN=LENC(HanZiSource)
LOCAL X(LN)
FOR I=1 TO LN
X(I)=SUBSTRC(HanZiSource,I,1)
NEXT
ELSE &&多行文本
IF Mode>=8 &&是文件名,则先读入
IF FILE(HanZiSource)
HanZiSource=FILETOSTR(HanZiSource)
ELSE &&文件名不存在,则直接返回空
RETURN ""
ENDIF
ENDIF
ALINES(X,HanZiSource) &&多行字符串转换为数组
ENDIF
nSortOrder=IIF(Mode%8<4,0,1) &&正反排序
ASORT(X,1,-1,nSortOrder) &&进行排序
P=X(1) &&重新组合成多行字符串
FOR I=2 TO ALEN(X)
P=P+IIF(Mode>16,"",CRLF)+X(I)
NEXT
RETURN P
FUNCTION LongSort(SourceFile as String ,DestFile as String ,;
Mode as Integer,MaxLineLength as Integer)
*对多行文本文件进行排序
*SourceFile:需要排序的多行文本文件名,行数不限
*DestFile:目标文件,文本文件或XML文件
*Mode:排序方式,为3个数字相加
* 0:按ASCII码排序,1:按拼音排序,2:按笔划排序
* 0:正序(小到大),4:逆序(大到小)
* 0:目标为文本文件,8:为XML文件
*返回:文本行数
SET SAFETY off
SET COLLATE TO IIF(Mode%4=0,"MACHINE",;
IIF(Mode%4=1,"PINYIN","STROKE"))
SELECT 0 &&新建临时表
CREATE CURSOR tmp (chz c(MaxLineLength))
APPEND FROM (SourceFile) sdf &&追加文本
Lines=RECCOUNT()
IF Mode%8<4 &&进行排序
INDEX ON chz tag tmp
ELSE
INDEX ON chz tag tmp DESC
ENDIF
IF Mode<8 &&输出到文件
COPY TO (DestFile) sdf
ELSE
CURSORTOXML("tmp",DestFile,528)
ENDIF
USE
RETURN Lines
ENDDEFINE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -