龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

获取首字符的拼音首字母

时间:2014-07-22 14:50来源: 作者: 点击:
分享到:
获取首字符的拼音首字母
获取首字符的拼音首字母
/*
在GB字符集中,按拼音排序的只有 B0A0 - D7FF 共 40 区,
以下是拼字 A-Z 起始的字符位置表
0xB0A1, 0xB0C5, 0xB2C1, 0xB4EE, 0xB6EA, 0xB7A2, 0xB8C1, // A-G *
0xB9FE, 0,      0xBBF7, 0xBFA6, 0xC0AC, 0xC2E8, 0xC4C3, // H-N MISS I *
0xC5B6, 0xC5BE, 0xC6DA, 0xC8BB, 0xC8F6, 0xCBFA, 0,      // O-T MISS U *
0,      0xCDDA, 0xCEF4, 0xD1B9, 0xD4D1,                 // W-Z MISS V *
*/
/**
 * 返回首字的拼音首字母(大写),如果获取失败,则返回空字符串
 * @param string $input_string
 * @param string $input_charset
 * @return string
 */
function getFirstPinyinChar($input_string, $input_charset = 'UTF-8') {
    if (empty($input_string)) {
        return '';
    }
    $first_byte = ord($input_string{0});
    if ($first_byte >= 0x41 && $first_byte <= 0x5A) {
        return $input_string{0}; // 大写字母,直接返回
    } else if ($first_byte >= 0x61 && $first_byte <= 0x7A) {
        return chr($first_byte - 32); // 小写字母,返回大写形式
    } else if ($first_byte > 0x7F) {
        // 多字节字符,进行以下操作
        $input_charset = strtoupper($input_charset);
        if ($input_charset == 'GB2312' ||
            $input_charset == 'GBK' ||
            $input_charset == 'GB18030' ||
            $input_charset == 'GB12345'
            ) {
        } else {
            // 非 GB 家庭的字符集,则转成 GBK 以便取拼音
            $input_string = iconv($input_charset, 'GB2312', $input_string);
            $first_byte = ord($input_string{0}); // 重新计算首字节的值
        }
        if ($first_byte < 0xB0 || $first_byte > 0xD7) {
            return ''; // 不在拼音检索区
        }
        $char_code = ($first_byte << 8) + ord($input_string{1});
        if ($char_code < 0xB0C5) {
            return "A";
        } else if ($char_code < 0xB2C1) {
            return "B";
        } else if ($char_code < 0xB4EE) {
            return "C";
        } else if ($char_code < 0xB6EA) {
            return "D";
        } else if ($char_code < 0xB7A2) {
            return "E";
        } else if ($char_code < 0xB8C1) {
            return "F";
        } else if ($char_code < 0xB9FE) {
            return "G";
        } else if ($char_code < 0xBBF7) {
            return "H";
        } else if ($char_code < 0xBFA6) {
            return "J";
        } else if ($char_code < 0xC0AC) {
            return "K";
        } else if ($char_code < 0xC2E8) {
            return "L";
        } else if ($char_code < 0xC4C3) {
            return "M";
        } else if ($char_code < 0xC5B6) {
            return "N";
        } else if ($char_code < 0xC5BE) {
            return "O";
        } else if ($char_code < 0xC6DA) {
            return "P";
        } else if ($char_code < 0xC8BB) {
            return "Q";
        } else if ($char_code < 0xC8F6) {
            return "R";
        } else if ($char_code < 0xCBFA) {
            return "S";
        } else if ($char_code < 0xCDDA) {
            return "T";
        } else if ($char_code < 0xCEF4) {
            return "W";
        } else if ($char_code < 0xD1B9) {
            return "X";
        } else if ($char_code < 0xD4D1) {
            return "Y";
        } else {
            return "Z";
        }
    }
    return '';
}
精彩图集

赞助商链接