⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 olehanzi.prg

📁 用VFP编写COM服务程序实现按汉字拼音与笔划进行排序及查询
💻 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 + -