php 中文转拼音首字母问题
<?phpfunctiongetfirstchar($s0){$fchar=ord(mb_substr($s0,0,1,"UTF-8"));if(($fchar>=ord...
<?php
function getfirstchar($s0) {
$fchar = ord(mb_substr($s0, 0, 1,"UTF-8"));
if (($fchar >= ord("a") and $fchar <= ord("z"))or($fchar >= ord("A") and $fchar <= ord("Z"))) return strtoupper(chr($fchar));
$s = iconv("UTF-8", "gb2312//IGNORE", $s0);
$asc = ord($s{0}) * 256 + ord($s{1})-65536;
if ($asc >= -20319 and $asc <= -20284)return "A";
if ($asc >= -20283 and $asc <= -19776)return "B";
if ($asc >= -19775 and $asc <= -19219)return "C";
if ($asc >= -19218 and $asc <= -18711)return "D";
if ($asc >= -18710 and $asc <= -18527)return "E";
if ($asc >= -18526 and $asc <= -18240)return "F";
if ($asc >= -18239 and $asc <= -17923)return "G";
if ($asc >= -17922 and $asc <= -17418)return "H";
if ($asc >= -17417 and $asc <= -16475)return "J";
if ($asc >= -16474 and $asc <= -16213)return "K";
if ($asc >= -16212 and $asc <= -15641)return "L";
if ($asc >= -15640 and $asc <= -15166)return "M";
if ($asc >= -15165 and $asc <= -14923)return "N";
if ($asc >= -14922 and $asc <= -14915)return "O";
if ($asc >= -14914 and $asc <= -14631)return "P";
if ($asc >= -14630 and $asc <= -14150)return "Q";
if ($asc >= -14149 and $asc <= -14091)return "R";
if ($asc >= -14090 and $asc <= -13319)return "S";
if ($asc >= -13318 and $asc <= -12839)return "T";
if ($asc >= -12838 and $asc <= -12557)return "W";
if ($asc >= -12556 and $asc <= -11848)return "X";
if ($asc >= -11847 and $asc <= -11056)return "Y";
if ($asc >= -11055 and $asc <= -10247)return "Z";
return null;
}
function getLetter($string)
{
$len=mb_strlen($string,'utf-8');
$pinyin='';
for ($i=0; $i<$len; $i++)
{
$word = mb_substr($string,$i,1,"UTF-8");
$pinyin.= getfirstchar($word);
}
return $pinyin;
}
echo strtolower(getLetter("妃"));?>
某些中文无法正常检测,比如那个‘妃’字是怎么回事 展开
function getfirstchar($s0) {
$fchar = ord(mb_substr($s0, 0, 1,"UTF-8"));
if (($fchar >= ord("a") and $fchar <= ord("z"))or($fchar >= ord("A") and $fchar <= ord("Z"))) return strtoupper(chr($fchar));
$s = iconv("UTF-8", "gb2312//IGNORE", $s0);
$asc = ord($s{0}) * 256 + ord($s{1})-65536;
if ($asc >= -20319 and $asc <= -20284)return "A";
if ($asc >= -20283 and $asc <= -19776)return "B";
if ($asc >= -19775 and $asc <= -19219)return "C";
if ($asc >= -19218 and $asc <= -18711)return "D";
if ($asc >= -18710 and $asc <= -18527)return "E";
if ($asc >= -18526 and $asc <= -18240)return "F";
if ($asc >= -18239 and $asc <= -17923)return "G";
if ($asc >= -17922 and $asc <= -17418)return "H";
if ($asc >= -17417 and $asc <= -16475)return "J";
if ($asc >= -16474 and $asc <= -16213)return "K";
if ($asc >= -16212 and $asc <= -15641)return "L";
if ($asc >= -15640 and $asc <= -15166)return "M";
if ($asc >= -15165 and $asc <= -14923)return "N";
if ($asc >= -14922 and $asc <= -14915)return "O";
if ($asc >= -14914 and $asc <= -14631)return "P";
if ($asc >= -14630 and $asc <= -14150)return "Q";
if ($asc >= -14149 and $asc <= -14091)return "R";
if ($asc >= -14090 and $asc <= -13319)return "S";
if ($asc >= -13318 and $asc <= -12839)return "T";
if ($asc >= -12838 and $asc <= -12557)return "W";
if ($asc >= -12556 and $asc <= -11848)return "X";
if ($asc >= -11847 and $asc <= -11056)return "Y";
if ($asc >= -11055 and $asc <= -10247)return "Z";
return null;
}
function getLetter($string)
{
$len=mb_strlen($string,'utf-8');
$pinyin='';
for ($i=0; $i<$len; $i++)
{
$word = mb_substr($string,$i,1,"UTF-8");
$pinyin.= getfirstchar($word);
}
return $pinyin;
}
echo strtolower(getLetter("妃"));?>
某些中文无法正常检测,比如那个‘妃’字是怎么回事 展开
2个回答
展开全部
原始代码有些问题,我做了些更改,原地址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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询