獲取中文串的首字母

相關知識儲備php

GB2312編碼範圍:A1A1 - FEFE ,其中漢字編碼範圍:B0A1-F7FE.
GB2312編碼是第一個漢字編碼國家標準,共收錄漢字6763個,其中一級漢字3755個,二級漢字3008個。同時,GB2312編碼收錄了包括拉丁字母,希臘字母,日文平假名及片假名字母、俄語西裏爾字母在內的682個全角字符。
 
分區表示
GB2312 編碼對所收錄字符進行了「分區」處理,共94個區,每區含有94個位,共8836個碼位。這種表示方法也稱爲區位碼。
01-09區收錄除漢字外的682個字符。
10-15區位空白區,沒有使用。
16-55區收錄了3755個一級漢字,按 拼音排序。
56-87區收錄了3008個二級漢字,按部首/筆畫排序。
88-94區爲空白區,沒有使用。
舉例來講,「啊」字是GB2312編碼中的第一個漢字,它位於16區的01位,因此它的區位碼就是1601
 
雙字節編碼
GB2312 規定對收錄的每一個字符采用兩個字節表示,第一個字節爲 「高字節」,對應94個區;第二個字節爲「低字節」,對應94個位。因此它的區位碼範圍是:0101-9494。 區號和位號分別加上0xA0 就是GB2312編碼。

例如最後一個碼位是9494,區號和位號分別轉換成十六進制是5E5E,0x5E+0xA0=0xFE,因此該碼位的GB2312編碼是FEFE。編碼

 
GB2312編碼範圍:A1A1-FEFE,其中漢字的編碼範圍爲B0A1-F7FE,第一字節0xB0-0xF7(對應區號:16-87),第二個字節0xA1-0xFE(對應位號:01-94)。
 
相關計算
 
區位碼、國標碼與機內碼的轉換關係方法:
(1)區位碼先轉換成十六進制數表示
(2)區位碼的十六進制表示)+2020H=國標碼;
(3)國標碼+8080H=機內碼
舉例:以漢字「大」爲例,「大」字的區內碼爲2083
一、區號爲20,位號爲83
二、將區位號2083轉換爲十六進制表示爲1453H
三、1453H+2020H=3473H,獲得國標碼3473H
四、3473H+8080H=B4F3H,獲得機內碼爲B4F3H
 
PHP代碼實現
<?php 
    //國標碼與區位碼轉換常量
    $GB_SP_DIFF = 160;
    //存放國標一級漢字不一樣讀音的起始 區位碼  
    $secPosValueList = array(1601, 1637, 1833, 2078,2274, 2302, 2433, 2594, 2787, 3106, 3212, 3472, 3635, 3722, 3730, 3858, 4027, 4086, 4390, 4558, 4684, 4925, 5249, 5600);
    //存放國標一級漢字不一樣讀音的起始區位碼對應讀音  
    $firstLetter = array('a', 'b', 'c', 'd', 'e', 'f','g', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'w', 'x', 'y', 'z');

    $string = "你們好"; 
    echo $string.'<br/>';
    $string=iconv( "UTF-8", "gb2312//IGNORE" , $string);
    $result = array(); 
    //十進制 
    for($i=0;$i<strlen($string);$i++){ 
        if(ord($string[$i])>127){ 
            $result[] = (ord($string[$i])-$GB_SP_DIFF).''.(ord($string[++$i])-$GB_SP_DIFF); //從十進制 -160 獲得區位碼
        } 
    } 

    //將區位碼轉對應的讀音
    $str='';
    for($i=0;$i<count($result);$i++){
         $j=getLetter($secPosValueList,$result[$i],count($secPosValueList),0);
         $str.=$firstLetter[$j];
    }
    echo '首字母:'.$str;
    //二分查找
    function getLetter($arr,$val,$hight,$low){
        while($low <= $hight){
            $mid = ceil($low + ($hight - $low) / 2);
            if($arr[$mid] <= $val && $arr[$mid+1] >$val){
                return $mid;
            }elseif($arr[$mid] > $val){
                $hight = $mid -1;
            }else{
                $low = $mid +1;
            }
        }
        return -1;
    }
?>

運行結果:spa

你們好
首字母:djh
code

相關文章
相關標籤/搜索