ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルで漢字の最初の文字を取得する方法の 2 つの例

PHP_PHP チュートリアルで漢字の最初の文字を取得する方法の 2 つの例

WBOY
WBOYオリジナル
2016-07-13 10:48:131021ブラウズ

中国語の文字の最初の文字を取得するには、通常、中国語の文字を分割してピンインに変換し、substr を使用して最初の文字を取得する方法がたくさんあります。以下に 2 つの例をオンラインで見つけました。自分のメリットを見てみましょう。

例1

主な機能は次のとおりです: クリア関数、変更、保守、拡張が簡単; 英語の文字列: 変更せずに返します (数字を含む); 中国語と英語の混合文字列: ピンインの最初の文字を返します。英語。このアルゴリズムは二分探索を使用して、文字 Z が Y として読み取られるという以前のエラーを修正します。良いものは集める必要があるので、後世の人々が検証できるようにここに痕跡を残しておきます。

コードは次のとおりです コードをコピー

/**
* 二分探索法を修正
* 中国語ピンイン頭文字ツール
* 注: 英語の文字列: 変更せずに返されます (数字を含む) 例: .abc123 => abc123
* 中国語の文字列: ピンインの最初の文字を返します。例: テスト文字列 => CSZFC
* 中国語と英語の混合文字列: ピンインと英語の最初の文字を返します。例: IiIj => WIWJ
* 例:
* $py = 新しい str2PY();
+*/
クラスstr2PY
{
プライベート $_pinyins = array(
176161 => 'A'、
176197 =>B'、
178193 =>C'、
180238 =>「D」、
182234 => 'E'、
183162 => 'F'、
184193 => 'G'、
185254 => 'H'、
187247 => 'J'、
191166 =>「K」、
192172 =>「L」、
194232 => 'M'、
196195 => 'N'、
197182 => 'O'、
197190 => 'P'、
198218 => 'Q'、
200187 => 'R'、
200246 =>「S」、
203250 => 'T'、
205218 => 'W'、
206244 => 'X'、
209185 =>「Y」、
212209 => 'Z'、
);
プライベート $_charset = null;
/**
* コンストラクター、必要なエンコーディングのデフォルトを指定します: utf-8
* utf-8、gb2312をサポート
*
* @param 不明なタイプ $charset
​​*/
パブリック関数 __construct( $charset = 'utf-8' )
{
$ this-> _charset }
/**
* 中国語の文字列部分
*
* @param 文字列 $str
* @param int $start
* @param int $len
* @戻り文字列
​​*/
プライベート関数 _msubstr ($str, $start, $len)
{
$start = $start * 2;
$len = $len * 2;
$strlen = strlen($str);
$result = '';
for ( $i = 0; $i If ( $i >= $start && $i If ( ord(substr($str, $i, 1)) > 129 ) $result .= substr($str, $i, 2);
else $result .= substr($str, $i, 1);
}
If ( ord(substr($str, $i, 1)) > 129 ) $i++;
        }
        $result を返します;
    }
    /**
※文字列を配列(漢字または1文字単位)に分割します
*
* @param 文字列 $str
* @return 配列
​​*/
    プライベート関数 _cutWord( $str )
    {
        $words = array();
         while ( $str != "" )
         {
            if ( $this->_isAscii($str) ) {/*非中文*/
                $words[] = $str[0];
                $str = substr( $str, strlen($str[0]) );
            }その他{
                $word = $this->msubstr( $str, 0, 1 );
                $words[] = $word;
                $str = substr( $str, strlen($word) );
            }
         }
         $words を返します;
    }
    /**
* 文字が ASCII 文字であるかどうかを判断します
*
* @param 文字列 $char
* @return bool
​​*/
    プライベート関数 _isAscii( $char )
    {
        return ( ord( substr($char,0,1) )     }
    /**
* 文字列の最初の 3 文字が ASCII 文字であるかどうかを判断します
*
* @param 文字列 $str
* @return bool
​​*/
    プライベート関数 _isAsciis( $str )
    {
        $len = strlen($str) >= 3 ? 3:2;
        $chars = array();
        for( $i = 1; $i             $chars[] = $this->_isAscii( $str[$i] ) ? 「はい」:「いいえ」;
        }
        $result = array_count_values( $chars );
        if ( empty($result['no']) ){
            true を返します;
        }
        false を返します;
    }
    /**
* 中国語文字列の最初のピンイン文字を取得します
*
* @param 文字列 $str
* @戻り文字列
​​*/
    パブリック関数 getInitials( $str )
    {
        if ( empty($str) ) return '';
        if ( $this->_isAscii($str[0]) && $this->_isAsciis( $str )){
            $str;
を返します         }
        $result = array();
        if ( $this->_charset == 'utf-8' ){
            $str = iconv( 'utf-8', 'gb2312', $str );
        }
        $words = $this->_cutWord( $str );
        foreach ( $words として $word )
        {
            if ( $this->_isAscii($word) ) {/*非中文*/
                $result[] = $word;
                続けます;
            }
            $code = ord( substr($word,0,1) ) * 1000 + ord( substr($word,1,1) );
            /*获取拼音首字母A--Z*/
            if ( ($i = $this->_search($code)) != -1 ){
                $result[] = $this->_pinyins[$i];
            }
        }
        return strtoupper(implode('',$result));
    }
    プライベート関数 _getChar( $ascii )
    {
        if ( $ascii >= 48 && $ascii <= 57){
            chr($ascii)を返します;  /*数字*/
        }elseif ( $ascii>=65 && $ascii<=90 ){
            chr($ascii)を返します;   /* A--Z*/
        }elseif ($ascii>=97 && $ascii<=122){
            chr($ascii-32)を返します; /* a--z*/
        }その他{
            戻る '-'; /*その他*/
        }
    }

/**
* 必要な漢字の内部コード (gb2312) に対応するピンイン文字 (二分法) を検索します
*
* @param int $code
* @return int
​​*/
    プライベート関数 _search( $code )
    {
        $data = array_keys($this->_pinyins);
        $下 = 0;
        $upper = sizeof($data)-1;
  $middle = (int)round(($ lower + $upper) / 2);
        if ( $code < $data[0] ) return -1;
        (;;) {
            if ( $ lower > $upper ){
                $data[$ lower-1] を返します;
            }
            $tmp = (int)round(($ lower + $upper) / 2);
            if ( !isset($data[$tmp]) ){
    $data[$middle] を返します;
            }その他{
    $middle = $tmp;
   }
            if ( $data[$middle] < $code ){
                $下 = (int)$中 + 1;
            }else if ( $data[$middle] == $code ) {
                $data[$middle] を返します;
            }その他{
                $upper = (int)$middle - 1;
            }
        }
    }
}
?>

例 2

漢字のasc範囲を取得し、漢字の最初の文字を返します。

コードは次のとおりです コードをコピー
関数 getfirstchar($s0){
$fchar = ord($s0{0}); If($fchar >= ord("A") および $fchar <= ord("z") )return strtoupper($s0{0}); $s1 = iconv("UTF-8","gb2312", $s0); $s2 = iconv("gb2312","UTF-8", $s1); If($s2 == $s0){$s = $s1;}else{$s = $s0;}
$asc = ord($s{0}) * 256 + ord($s{1}) - 65536; If($asc >= -20319 および $asc ; If($asc >= -20283 および $asc ; If($asc >= -19775 および $asc ; If($asc >= -19218 および $asc ; If($asc >= -18710 および $asc ; If($asc >= -17922 および $asc ; If($asc >= -16212 および $asc ; If($asc >= -15640 および $asc ; If($asc >= -14922 および $asc ; If($asc >= -11847 および $asc ; If($asc >= -11055 および $asc ; null を返します。 }


関数ピンイン1($zh){
$ret = ""; $s1 = iconv("UTF-8","gb2312", $zh); $s2 = iconv("gb2312","UTF-8", $s1); If($s2 == $zh){$zh = $s1;}
for($i = 0; $i $s1 = substr($zh,$i,1); $p = ord($s1); If($p > 160){
$s2 = substr($zh,$i++,2); $ret .= getfirstchar($s2); }その他{
$ret .= $s1; }
}
$ret を返します。 }
echo "これは中国語の文字列です
"; echo pinyin1('これは中国語の文字列です');
?>





www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632803.html技術記事中国語の文字の最初の文字を取得するには、通常、中国語の文字を分割してピンインに変換し、substr を使用して最初の文字を取得する方法がたくさんあります。以下にオンラインで 2 つの実用的な方法を見つけました。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。