PHP实现汉字转拼音类,GB2312标准共收录6763个汉字,不在范围内的汉字是无法转换,如:中国前总理朱镕基的“镕”字。
GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。(3755个)
56-87区为二级汉字,按部首/笔画排序。(3008个)
10-15区及88-94区则未有编码。
占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。所以实际共6763个汉字。其中一级汉字3755个,二级汉字3008个。而此类算法实际只能转换3755个汉字。
优点:没有使用大文字库,文件相对较小,没有使用正则表达式,性能相对较高。支持首字母转换。
缺点:只能转换3755个汉字,多音字无法识别。
具体代码如下:
<?php
// 此类是根据ASCII码转换,GB2312库对多音字也无能为力,此类优点是性能比较高。
// GB2312标准共收录6763个汉字,此类的算法只支持其中的一级汉字3755个,不在范围内的汉字是无法转换,如:中国前总理朱镕基的“镕”字。
class pinyin{
public static function utf8_to($s, $isfirst = false) {
return self::to(self::utf8_to_gb2312($s), $isfirst);
}
public static function utf8_to_gb2312($s) {
return iconv("UTF-8", "GB2312//IGNORE", $s);
}
// 字符串必须为GB2312编码
public static function to($s, $isfirst = false) {
$res = "";
$len = strlen($s);
$pinyin_arr = self::get_pinyin_array();
for($i=0; $i<$len; $i++) {
$ascii = ord($s[$i]);
if($ascii > 0x80) {
$ascii2 = ord($s[++$i]);
$ascii = $ascii * 256 + $ascii2 - 65536;
}
if($ascii < 255 && $ascii > 0) {
if(($ascii >= 48 && $ascii <= 57) || ($ascii >= 97 && $ascii <= 122)) {
$res .= $s[$i]; // 0-9 a-z
}elseif($ascii >= 65 && $ascii <= 90) {
$res .= strtolower($s[$i]); // A-Z
}else{
$res .= "_";
}
}elseif($ascii < -20319 || $ascii > -10247) {
$res .= "_";
}else{
foreach($pinyin_arr as $py=>$asc) {
if($asc <= $ascii) {
$res .= $isfirst ? $py[0] : $py;
break;
}
}
}
}
return $res;
}
public static function to_first($s) {
$ascii = ord($s[0]);
if($ascii > 0xE0) {
$s = self::utf8_to_gb2312($s[0].$s[1].$s[2]);
}elseif($ascii < 0x80) {
if($ascii >= 65 && $ascii <= 90) {
return strtolower($s[0]);
}elseif($ascii >= 97 && $ascii <= 122) {
return $s[0];
}else{
return false;
}
}
if(strlen($s) < 2) {
return false;
}
$asc = ord($s[0]) * 256 + ord($s[1]) - 65536;
if($asc>=-20319 && $asc<=-20284) return "a";
if($asc>=-20283 && $asc<=-19776) return "b";
if($asc>=-19775 && $asc<=-19219) return "c";
if($asc>=-19218 && $asc<=-18711) return "d";
if($asc>=-18710 && $asc<=-18527) return "e";
if($asc>=-18526 && $asc<=-18240) return "f";
if($asc>=-18239 && $asc<=-17923) return "g";
if($asc>=-17922 && $asc<=-17418) return "h";
if($asc>=-17417 && $asc<=-16475) return "j";
if($asc>=-16474 && $asc<=-16213) return "k";
if($asc>=-16212 && $asc<=-15641) return "l";
if($asc>=-15640 && $asc<=-15166) return "m";
if($asc>=-15165 && $asc<=-14923) return "n";
if($asc>=-14922 && $asc<=-14915) return "o";
if($asc>=-14914 && $asc<=-14631) return "p";
if($asc>=-14630 && $asc<=-14150) return "q";
if($asc>=-14149 && $asc<=-14091) return "r";
if($asc>=-14090 && $asc<=-13319) return "s";
if($asc>=-13318 && $asc<=-12839) return "t";
if($asc>=-12838 && $asc<=-12557) return "w";
if($asc>=-12556 && $asc<=-11848) return "x";
if($asc>=-11847 && $asc<=-11056) return "y";
if($asc>=-11055 && $asc<=-10247) return "z";
return false;
}