原始代碼有些問題,我做了些更改,原地址github 的 chenall/chenall/blob/master/php/tools/ZH-cn_TO_pinyin.php
<?php/*
中文漢字轉拼音首字母的PHP簡易實現方法.
要求:?只能是GB2312碼表裏面中文字符
轉換得到字符串對應的拼音首字母大寫.
用法:
echo?zh2py::conv('Chinese?中華人民***和國');//Chinese?ZHRMGHG
或
$py?=?new?zh2py;
echo?$py->conv('Chinese?中華人民***和國');//Chinese?ZHRMGHG
*/
class?zh2py
{
//根據漢字區位表
//我們可以看到從16-55區之間是按拼音字母排序的,所以我們只需要判斷某個漢字的區位碼就可以得知它的拼音首字母.
//區位表第壹部份,按拼音字母排序的.
//16區-55區
/*
'A'=>0xB0A1,?'B'=>0xB0C5,?'C'=>0xB2C1,?'D'=>0xB4EE,?'E'=>0xB6EA,?'F'=>0xB7A2,?'G'=>0xB8C1,'H'=>0xB9FE,
'J'=>0xBBF7,?'K'=>0xBFA6,?'L'=>0xC0AC,?'M'=>0xC2E8,?'N'=>0xC4C3,?'O'=>0xC5B6,?'P'=>0xC5BE,'Q'=>0xC6DA,
'R'=>0xC8BB,?'S'=>0xC8F6,?'T'=>0xCBFA,?'W'=>0xCDDA,?'X'=>0xCEF4,?'Y'=>0xD1B9,?'Z'=>0xD4D1
*/
private?static?$FirstTable?=?array(
0xB0C5,?0xB2C1,?0xB4EE,?0xB6EA,?0xB7A2,?0xB8C1,?0xB9FE,?0xBBF7,?0xBFA6,?0xC0AC,?0xC2E8,
0xC4C3,?0xC5B6,?0xC5BE,?0xC6DA,?0xC8BB,?0xC8F6,?0xCBFA,?0xCDDA,?0xCEF4,?0xD1B9,?0xD4D1,0xD7FA
);
private?static?$FirstLetter?=?"ABCDEFGHJKLMNOPQRSTWXYZ";
//區位表第二部份,不規則的,下面的字母是每個區裏面對應字的拼音首字母.從網上查詢整理出來的,可能會有部份錯誤.
//56區-87區
private?static?$SecondTable?=?array(
"CJWGNSPGCGNEGYPBTYYZDXYKYGTZJNMJQMBSGZSCYJSYYFPGKBZGYDYWJKGKLJSWKPJQHYJWRDZLSYMRYPYWWCCKZNKYYG",
"TTNGJEYKKZYTCJNMCYLQLYPYSFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCKBPHFFSSTYBGMXLPBYLLBHLX",
"SMZMYJHSOJNGHDZQYKLGJHSGQZHXQGKXZZWYSCSCJXYEYXADZPMDSSMZJZQJYZCJJFWQJBDZBXGZNZCPWHWXHQKMWFBPBY",
"DTJZZKXHYLYGXFPTYJYYZPSZLFCHMQSHGMXXSXJYQDCSBBQBEFSJYHWWGZKPYLQBGLDLCDTNMAYDDKSSNGYCSGXLYZAYPN",
"PTSDKDYLHGYMYLCXPYCJNDQJWXQXFYYFJLEJPZRXCCQWQQSBZKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMQJCJLY",
"QGJMSHZKBSWYEMYLTXFSYDXWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCL",
"QKXLHXJRZJMFQHXHWYWSBHTRXXGLHQHFNMGYKLDYXZPYLGGSMTCFBAJJZYLJTYANJGBJPLQGSZYQYAXBKYSECJSZNSLYZH",
"ZXLZCGHPXZHZNYTDSBCJKDLZAYFFYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCS",
"YDBDLLSCDDNLKJYKJSYCJLKWHQASDKNHCSGAGHDAASHTCPLCPQYBSZMPJLPCJOQLCDHJJYSPRCHNWJNLHLYYQYYWZPTCZG",
"WWMZFFJQQQQYXACLBHKDJXDGMMYDJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYDCFCXYHLXCHYZJQSQQAGMNYXPFRKSSBJLYXY",
"SYGLNSCMHCWWMNZJJLXXHCHSYZSTTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLYXDCCWZOCWKCCSBNHCPDYZNFCYYTYCKX",
"KYBSQKKYTQQXFCMCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQKZPQSQSCFYMMDMGBWHWLGSLLYSDLMLXPTHMJ",
"HWLJZYHZJXKTXJLHXRSWLWZJCBXMHZQXSDZPSGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCL",
"SLDCLRPBHZHXYYFHBMGDMYCNQQWLQHJJCYWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSLJHTZKZJECXJCJNMFBYCSFYWYB",
"JZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNTXHPLQKZCZWALSBCZJXSYZGWK",
"YPSGXFZFCDKHJGXTLQFSGDSLQWZKXTMHSBGZMJZRGLYJBPMLMSXLZJQQHZYJCZYDJWFMJKLDDPMJEGXYHYLXHLQYQHKYCW",
"CJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLTCKLYRZZGQTTJHHHJLJAXFGFJZSLCFDQZ",
"LCLGJDJZSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNW",
"CZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTXYXNBSKYZZGJZLQJTFCJXDYGJQJJPMGWGJJJPKQSB",
"GBMMCJSSCLPQPDXCDYYKYPCJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJYFYZDJCNMWESCYGLBTZZGMSS",
"LLYXYSXXBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMCYHYWDBXBTLMSYYYFSXJCBDXXLHJHFSSXZQHFZMZCZTQCXZXRTT",
"DJHNRYZQQMTQDMMGNYDXMJGDXCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGSQQDDJCMBKZFFXMKDMDSYYSZCMLJDSYN",
"SPRSKMKMPCKLGTBQTFZSWTFGGLYPLLJZHGJJGYPZLTCSMCNBTJBQFKDHBYZGKPBBYMTDSSXTBNPDKLEYCJNYCDYKZTDHQH",
"SYZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDXJPLDLPCQDHZYCBZSCZBZMSLJFLKR",
"ZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLGNDJLSLYGKDZPZXJYYZLWCXSZFGWYYDLYHCLJS",
"CMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJYYCNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPYXJCJLZCSHLTOLJNMDDDLNGKATHQH",
"JHYKHEZNMSHRPHQQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMM",
"MYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYJDJJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZKHHGFLBCSMDLDG",
"DZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYG",
"CTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZ",
"GSZZQLYLWTJPFSYASMCJBTZYYCWMYTZSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQFHBS",
"AQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ",
);
public?static?function?utf8_to_gbk($string)//編碼轉換,必須轉換成GB2312字符,這裏只是簡單的判斷並不是很準確,可以自己寫壹個.
{
if?(mb_check_encoding($string,'gb2312'))
return?$string;
if?(function_exists('iconv'))
return?iconv("utf-8","gb2312//IGNORE",$string);
return?mb_convert_encoding($string,'gb2312','utf-8');?
}
public?static?function?conv($str)
{
$str?=?self::utf8_to_gbk($str);
$len?=?strlen($str);
$newStr?=?'';
for($i=0;?$i<$len?;?++$i)
{
$H?=?ord($str[$i]);
$L?=?ord($str[$i+1]);
//字符集非法
if?($H?<?0xB0?||?$L?<?0xA1?||?$H?>?0xF7?||?$L?==?0xFF)
{
$newStr?.=?$str[$i];
continue;
}
if?($H?<?0xD8)//($H?>=?0xB0?&&?$H?<=0xD7)//查詢文字在壹級漢字區(16-55)
{
$W?=?($H?<<?8)?|?$L;
foreach(self::$FirstTable?as?$key=>$value)
{
if?($W?<?$value)
{
$newStr?.=?self::$FirstLetter[$key];
break;
}
}
}
else//?if?(H?>=?0xD8?&&?H?<=?0xF7)//查詢中文在二級漢字區(56-87)
$newStr?.=self::$SecondTable[$H?-?0xD8][$L-0xA1];
++$i;
}
return?$newStr;
}
}
echo?zh2py::conv('妃');//F