インターネット上には同じ原理のメソッドがたくさんありますが、必要に応じてクラス ファイルのバージョンを作成しました。主な機能は次のとおりです。変更、保守、拡張が簡単です。英語の文字列は変更されません。 (数字を含む) ); 中国語文字列: ピンインの最初の文字を返します; 中国語と英語の混合文字列: ピンインと英語の最初の文字を返します。このアルゴリズムは二分探索を使用して、文字 Z が Y として読み取られるという以前のエラーを修正します。良いものは集める必要があるので、後世の人々が検証できるようにここに痕跡を残しておきます。
/**
* http://iulog.com @ 2013-05-07 によって変更されました
* 二分検索方法を修正しました
* 中国語ピンイン頭文字ツール クラス
* 注: 英語の文字列: 変更せずに返します (数字を含む) 例: abc123 => ; abc123
* 中国語の文字列: ピンインの最初の文字を返します。例: CSZFC
* 中国語と英語の混合文字列: 例: IiIj
; );
*/
class str2PY
{
private $_pinyins = array(
176161 => 'A',
176197 => B',
178193 => 'C',
180238 =>D',
183162 =>F,
184193 =>
185254 => 187247 => 'J',
191166 =>,
192172 => 'M',
196195 >「N」、
197182 => O',
197190 =>、
198218 =>、
200187 =>、
200246 => 203250 => 'T',
205218 => 'W',
206244 =>,
209185 =>
212209 =>
プライベート $_charset = null;
/**
*コンストラクター、必要なエンコーディングデフォルトを指定:UTF-8
*サポートUTF-8、GB2312*/
public function __construct( $charset = 'utf-8' )
{
$this->_charset = $charset;
}
/**
* 中国語の文字列 substr
* * @param string substr*/
private function _msubstr ($str, $ start, $len)
{
$start = $start * 2;
$len = $len * 2;
$strlen = strlen($str);
$result = '';
for ( $i = 0; $i if ( $i >= $start && $i < ($start + $len) ) {
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;
}
/**
*/
private function _cutWord( $str )
{
$words = array();
while ( $str != "" )
{
if ( $this->_isアスキー($ str) ) {/*非中文*/
$words[] = $str[0];
$str = substr( $str, strlen($str[0]) );
}else{
$ワード = $ this->_msubstr( $str, 0, 1 );
$words[] = $word;
$str = substr( $str, strlen($word) );
}
return $words;
}
/***/
プライベート関数 _isAscii( $char )
{
return ( ord( substr($char,0,1) ) }
/**
*文字列の最初の3文字がASCII文字であるかどうかを判断します
*
* @param string $str
*/
プライベート関数 _isAsciis( $str )
{
$len = strlen($str) >= 3 ? 3: 2;
$chars = array();
for( $i = 1; $i < $len -1; $i++ ){
$chars[] = $this->_isAscii( $str[$私] ) ? 'yes':'no';
}
$result = array_count_values( $chars );
if ( empty($result['no']) ){
trueを返す;
}
falseを返す;
}
/* *
* 中国語文字列の最初のピンイン文字を取得します
*
* @param string $str
*/
public function getInitials( $str )
{
if ( empty($str) ) return '';
if ( $this->_isAscii($str[0]) && $this-> ;_isAsciis( $str )){
return $str;
}
$result = array();
if ( $this->_charset == 'utf-8' ){
$str = iconv( ' utf- 8', 'gb2312', $str );
}
$words = $this->_cutWord( $str );
foreach ( $words as $word )
{
if ( $this->_isAs cii($ 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){
return chr($ascii); /*数字*/
}elseif ( $ascii>=65 && $ascii<=90 ){
return chr($ascii); /* A--Z*/
}elseif ($ascii>=97 && $ascii<=122){
return chr($ascii-32); /* a--z*/
}else{
return '-'; /*その他*/
}
}
/**
*/
private function _search( $code )
{
$data = array_keys($this->_pinyins);
$ lower = 0;
$upper = sizeof($data)-1 ;
$middle = (int)round(($ lower + $upper) / 2);
if ( $code for (;;) {
if ( $ lower > $upper ){
return $data[$ lower-1];
}
$tmp = (int)round(($ lower + $upper) / 2);
if ( !isset($data[$tmp ]) ){
return $data[$middle];
}else{
$middle = $tmp;
}
if ( $data[$middle] < $code ){
$ lower = ( int)$middle + 1;
}else if ( $data[$middle] == $code ) {
return $data[$middle];
}else{
$upper = (int)$middle - 1;
}
}
}
}
?>