首页 > 其他 > 网站日记>正文

帝国cms二开之获取字符串拼音

提示: 阅读权限:公开  

帝国cms二次开发中,往往需要取得字符串的拼音,或者汉语字符的首字母。那么,有一个好消息,一个坏消息。
好消息是,帝国cms非常重视和需要拼音功能,所以在核心文件connet.php中内置了拼音函数。坏消息是,在大于php7的版本中,有些问题。

 

//返回拼音
function ReturnPinyinFun($hz){
	global $ecms_config;
	include_once(ECMS_PATH.'e/class/epinyin.php');
	//编码
	if($ecms_config['sets']['pagechar']!='gb2312')
	{
		include_once(ECMS_PATH.'e/class/doiconv.php');
		$iconv=new Chinese('');
		$char=$ecms_config['sets']['pagechar']=='big5'?'BIG5':'UTF8';
		$targetchar='GB2312';
		$hz=$iconv->Convert($char,$targetchar,$hz);
	}
	return c($hz);
}

//取得字母
function GetInfoZm($hz){
	if(!trim($hz))
	{
		return '';
	}
	$py=ReturnPinyinFun($hz);
	$zm=substr($py,0,1);
	return strtoupper($zm);
}

可以看到,获取拼音的功能依赖于

e/class/epinyin.php

其内容为:

 

<?php
//返回拼音
function rpyd(){
$d=array(  
array("a",-20319),  
array("ai",-20317),  
array("an",-20304),  
array("ang",-20295),  
array("ao",-20292),  
array("ba",-20283),  
array("bai",-20265),  
array("ban",-20257),  
array("bang",-20242),  
array("bao",-20230),  
array("bei",-20051),  
array("ben",-20036),  
array("beng",-20032),  
array("bi",-20026),  
array("bian",-20002),  
array("biao",-19990),  
array("bie",-19986),  
array("bin",-19982),  
array("bing",-19976),  
array("bo",-19805),  
array("bu",-19784),  
array("ca",-19775),  
array("cai",-19774),  
array("can",-19763),  
array("cang",-19756),  
array("cao",-19751),  
array("ce",-19746),  
array("ceng",-19741),  
array("cha",-19739),  
array("chai",-19728),  
array("chan",-19725),  
array("chang",-19715),  
array("chao",-19540),  
array("che",-19531),  
array("chen",-19525),  
array("cheng",-19515),  
array("chi",-19500),  
array("chong",-19484),  
array("chou",-19479),  
array("chu",-19467),  
array("chuai",-19289),  
array("chuan",-19288),  
array("chuang",-19281),  
array("chui",-19275),  
array("chun",-19270),  
array("chuo",-19263),  
array("ci",-19261),  
array("cong",-19249),  
array("cou",-19243),  
array("cu",-19242),  
array("cuan",-19238),  
array("cui",-19235),  
array("cun",-19227),  
array("cuo",-19224),  
array("da",-19218),  
array("dai",-19212),  
array("dan",-19038),  
array("dang",-19023),  
array("dao",-19018),  
array("de",-19006),  
array("deng",-19003),  
array("di",-18996),  
array("dian",-18977),  
array("diao",-18961),  
array("die",-18952),  
array("ding",-18783),  
array("diu",-18774),  
array("dong",-18773),  
array("dou",-18763),  
array("du",-18756),  
array("duan",-18741),  
array("dui",-18735),  
array("dun",-18731),  
array("duo",-18722),  
array("e",-18710),  
array("en",-18697),  
array("er",-18696),  
array("fa",-18526),  
array("fan",-18518),  
array("fang",-18501),  
array("fei",-18490),  
array("fen",-18478),  
array("feng",-18463),  
array("fo",-18448),  
array("fou",-18447),  
array("fu",-18446),  
array("ga",-18239),  
array("gai",-18237),  
array("gan",-18231),  
array("gang",-18220),  
array("gao",-18211),  
array("ge",-18201),  
array("gei",-18184),  
array("gen",-18183),  
array("geng",-18181),  
array("gong",-18012),  
array("gou",-17997),  
array("gu",-17988),  
array("gua",-17970),  
array("guai",-17964),  
array("guan",-17961),  
array("guang",-17950),  
array("gui",-17947),  
array("gun",-17931),  
array("guo",-17928),  
array("ha",-17922),  
array("hai",-17759),  
array("han",-17752),  
array("hang",-17733),  
array("hao",-17730),  
array("he",-17721),  
array("hei",-17703),  
array("hen",-17701),  
array("heng",-17697),  
array("hong",-17692),  
array("hou",-17683),  
array("hu",-17676),  
array("hua",-17496),  
array("huai",-17487),  
array("huan",-17482),  
array("huang",-17468),  
array("hui",-17454),  
array("hun",-17433),  
array("huo",-17427),  
array("ji",-17417),  
array("jia",-17202),  
array("jian",-17185),  
array("jiang",-16983),  
array("jiao",-16970),  
array("jie",-16942),  
array("jin",-16915),  
array("jing",-16733),  
array("jiong",-16708),  
array("jiu",-16706),  
array("ju",-16689),  
array("juan",-16664),  
array("jue",-16657),  
array("jun",-16647),  
array("ka",-16474),  
array("kai",-16470),  
array("kan",-16465),  
array("kang",-16459),  
array("kao",-16452),  
array("ke",-16448),  
array("ken",-16433),  
array("keng",-16429),  
array("kong",-16427),  
array("kou",-16423),  
array("ku",-16419),  
array("kua",-16412),  
array("kuai",-16407),  
array("kuan",-16403),  
array("kuang",-16401),  
array("kui",-16393),  
array("kun",-16220),  
array("kuo",-16216),  
array("la",-16212),  
array("lai",-16205),  
array("lan",-16202),  
array("lang",-16187),  
array("lao",-16180),  
array("le",-16171),  
array("lei",-16169),  
array("leng",-16158),  
array("li",-16155),  
array("lia",-15959),  
array("lian",-15958),  
array("liang",-15944),  
array("liao",-15933),  
array("lie",-15920),  
array("lin",-15915),  
array("ling",-15903),  
array("liu",-15889),  
array("long",-15878),  
array("lou",-15707),  
array("lu",-15701),  
array("lv",-15681),  
array("luan",-15667),  
array("lue",-15661),  
array("lun",-15659),  
array("luo",-15652),  
array("ma",-15640),  
array("mai",-15631),  
array("man",-15625),  
array("mang",-15454),  
array("mao",-15448),  
array("me",-15436),  
array("mei",-15435),  
array("men",-15419),  
array("meng",-15416),  
array("mi",-15408),  
array("mian",-15394),  
array("miao",-15385),  
array("mie",-15377),  
array("min",-15375),  
array("ming",-15369),  
array("miu",-15363),  
array("mo",-15362),  
array("mou",-15183),  
array("mu",-15180),  
array("na",-15165),  
array("nai",-15158),  
array("nan",-15153),  
array("nang",-15150),  
array("nao",-15149),  
array("ne",-15144),  
array("nei",-15143),  
array("nen",-15141),  
array("neng",-15140),  
array("ni",-15139),  
array("nian",-15128),  
array("niang",-15121),  
array("niao",-15119),  
array("nie",-15117),  
array("nin",-15110),  
array("ning",-15109),  
array("niu",-14941),  
array("nong",-14937),  
array("nu",-14933),  
array("nv",-14930),  
array("nuan",-14929),  
array("nue",-14928),  
array("nuo",-14926),  
array("o",-14922),  
array("ou",-14921),  
array("pa",-14914),  
array("pai",-14908),  
array("pan",-14902),  
array("pang",-14894),  
array("pao",-14889),  
array("pei",-14882),  
array("pen",-14873),  
array("peng",-14871),  
array("pi",-14857),  
array("pian",-14678),  
array("piao",-14674),  
array("pie",-14670),  
array("pin",-14668),  
array("ping",-14663),  
array("po",-14654),  
array("pu",-14645),  
array("qi",-14630),  
array("qia",-14594),  
array("qian",-14429),  
array("qiang",-14407),  
array("qiao",-14399),  
array("qie",-14384),  
array("qin",-14379),  
array("qing",-14368),  
array("qiong",-14355),  
array("qiu",-14353),  
array("qu",-14345),  
array("quan",-14170),  
array("que",-14159),  
array("qun",-14151),  
array("ran",-14149),  
array("rang",-14145),  
array("rao",-14140),  
array("re",-14137),  
array("ren",-14135),  
array("reng",-14125),  
array("ri",-14123),  
array("rong",-14122),  
array("rou",-14112),  
array("ru",-14109),  
array("ruan",-14099),  
array("rui",-14097),  
array("run",-14094),  
array("ruo",-14092),  
array("sa",-14090),  
array("sai",-14087),  
array("san",-14083),  
array("sang",-13917),  
array("sao",-13914),  
array("se",-13910),  
array("sen",-13907),  
array("seng",-13906),  
array("sha",-13905),  
array("shai",-13896),  
array("shan",-13894),  
array("shang",-13878),  
array("shao",-13870),  
array("she",-13859),  
array("shen",-13847),  
array("sheng",-13831),  
array("shi",-13658),  
array("shou",-13611),  
array("shu",-13601),  
array("shua",-13406),  
array("shuai",-13404),  
array("shuan",-13400),  
array("shuang",-13398),  
array("shui",-13395),  
array("shun",-13391),  
array("shuo",-13387),  
array("si",-13383),  
array("song",-13367),  
array("sou",-13359),  
array("su",-13356),  
array("suan",-13343),  
array("sui",-13340),  
array("sun",-13329),  
array("suo",-13326),  
array("ta",-13318),  
array("tai",-13147),  
array("tan",-13138),  
array("tang",-13120),  
array("tao",-13107),  
array("te",-13096),  
array("teng",-13095),  
array("ti",-13091),  
array("tian",-13076),  
array("tiao",-13068),  
array("tie",-13063),  
array("ting",-13060),  
array("tong",-12888),  
array("tou",-12875),  
array("tu",-12871),  
array("tuan",-12860),  
array("tui",-12858),  
array("tun",-12852),  
array("tuo",-12849),  
array("wa",-12838),  
array("wai",-12831),  
array("wan",-12829),  
array("wang",-12812),  
array("wei",-12802),  
array("wen",-12607),  
array("weng",-12597),  
array("wo",-12594),  
array("wu",-12585),  
array("xi",-12556),  
array("xia",-12359),  
array("xian",-12346),  
array("xiang",-12320),  
array("xiao",-12300),  
array("xie",-12120),  
array("xin",-12099),  
array("xing",-12089),  
array("xiong",-12074),  
array("xiu",-12067),  
array("xu",-12058),  
array("xuan",-12039),  
array("xue",-11867),  
array("xun",-11861),  
array("ya",-11847),  
array("yan",-11831),  
array("yang",-11798),  
array("yao",-11781),  
array("ye",-11604),  
array("yi",-11589),  
array("yin",-11536),  
array("ying",-11358),  
array("yo",-11340),  
array("yong",-11339),  
array("you",-11324),  
array("yu",-11303),  
array("yuan",-11097),  
array("yue",-11077),  
array("yun",-11067),  
array("za",-11055),  
array("zai",-11052),  
array("zan",-11045),  
array("zang",-11041),  
array("zao",-11038),  
array("ze",-11024),  
array("zei",-11020),  
array("zen",-11019),  
array("zeng",-11018),  
array("zha",-11014),  
array("zhai",-10838),  
array("zhan",-10832),  
array("zhang",-10815),  
array("zhao",-10800),  
array("zhe",-10790),  
array("zhen",-10780),  
array("zheng",-10764),  
array("zhi",-10587),  
array("zhong",-10544),  
array("zhou",-10533),  
array("zhu",-10519),  
array("zhua",-10331),  
array("zhuai",-10329),  
array("zhuan",-10328),  
array("zhuang",-10322),  
array("zhui",-10315),  
array("zhun",-10309),  
array("zhuo",-10307),  
array("zi",-10296),  
array("zong",-10281),  
array("zou",-10274),  
array("zu",-10270),  
array("zuan",-10262),  
array("zui",-10260),  
array("zun",-10256),  
array("zuo",-10254)  
);
	return $d;
}

function g($num){
	$d=rpyd();
	if($num>0&&$num<160)
	{  
		return  chr($num);  
	}
	elseif($num<-20319||$num>-10247)
	{  
		return "";  
	}
	else
	{
		for($i=count($d)-1;$i>=0;$i--){if($d[$i][1]<=$num)break;}  
		return $d[$i][0];  
	}
}

function c($str){  
	$ret="";
	for($i=0;$i<strlen($str);$i++)
	{ 
		$p=ord(substr($str,$i,1));  
		if($p>160)
		{  
			$q=ord(substr($str,++$i,1));  
			$p=$p*256+$q-65536;  
		}
		$ret.=g($p);  
	}
	return $ret;  
}
?>

 

容易看到,拼音的获取实在gb231的编码下实现的,如果是utf8编码,需要先转换成gb2312编码才行。恰恰是这个转换,在php7以后的版本中会出问题。

建议修改如下:

//返回拼音
function ReturnPinyinFun($hz){
	global $ecms_config;
	include_once(ECMS_PATH.'e/class/epinyin.php');
	//编码
	if($ecms_config['sets']['pagechar']!='gb2312')
	{
		$hz= mb_convert_encoding($hz,'gbk',$ecms_config['sets']['pagechar']);
		
	}
	return c($hz);
}

 

上一篇:帝国cms普通搜索实现分词搜素的优化

下一篇:代码片段获取当前web服务的域名和协议

tags: 帝国cms 获取 字符串 拼音

返回首页

相关

热门

站内直通车

[!--temp.bottomnav--]
返回顶部