/**
* 二分探索法を修正
* 中国語ピンイン頭文字ツール
* 注: 英語の文字列: 変更せずに返されます (数字を含む) 例: .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;
}
}
}
}
?>
|