基於漢字編碼區間映射表實現的拼音轉換類,無需外部擴展,支援全拼輸出、首字母縮寫、自定義分隔符與長度截取。
$num = $high * 256 + $low - 65536(得到負數區間)。$pylist(拼音 => 區間起始碼),按區間查找所屬拼音。<?php
class GetPingYing {
private $pylist = array(
'a' => -20319, 'ai' => -20317, 'an' => -20304, 'ang' => -20295, 'ao' => -20292,
'ba' => -20283, 'bai' => -20265, 'ban' => -20257, 'bang' => -20242, 'bao' => -20230,
// ... 完整映射表(原文含 400+ 條,此處省略) ...
'zuo' => -10254
);
// 獲取全拼
public function getAllPY($chinese, $delimiter = '', $length = 0) {
$py = $this->zh_to_pys($chinese, $delimiter);
if ($length) $py = substr($py, 0, $length);
return $py;
}
// 獲取首字母
public function getFirstPY($chinese) {
$result = '';
for ($i = 0; $i < strlen($chinese); $i++) {
$p = ord(substr($chinese, $i, 1));
if ($p > 160) {
$q = ord(substr($chinese, ++$i, 1));
$p = $p * 256 + $q - 65536;
}
$result .= substr($this->zh_to_py($p), 0, 1);
}
return $result;
}
private function zh_to_py($num, $blank = '') {
if ($num > 0 && $num < 160) return chr($num);
if ($num < -20319 || $num > -10247) return $blank;
foreach ($this->pylist as $py => $code) {
if ($code > $num) break;
$result = $py;
}
return $result;
}
private function zh_to_pys($chinese, $delimiter = ' ', $first = 0) {
$result = array();
for ($i = 0; $i < strlen($chinese); $i++) {
$p = ord(substr($chinese, $i, 1));
if ($p > 160) {
$q = ord(substr($chinese, ++$i, 1));
$p = $p * 256 + $q - 65536;
}
$result[] = $this->zh_to_py($p);
if ($first) return $result[0];
}
return implode($delimiter, $result);
}
}
// 測試
$PingYing = new GetPingYing();
echo $PingYing->getFirstPY('羽泉樂隊,歌不錯-推薦'); // yqldgbc-tj
echo '<br>';
echo $PingYing->getAllPY('羽泉樂隊,歌不錯-推薦'); // yu quan yue dui , ge bu cuo - tui jian
?>
getAllPY($str, $delimiter, $length):全拼,分隔符預設空格,可指定長度截取。getFirstPY($str):首字母縮寫,適合生成拼音縮寫索引。iconv('UTF-8', 'GBK//IGNORE', $str) 轉碼。此類適合中文排序、搜尋提示、URL 生成等場景,輕量無依賴,易於整合。