<?php
/**
* 修复二分法查找方法
* 汉字拼音首字母工具类
* 注: 英文的字串:不变返回(包括数字) eg .abc123 => abc123
* 中文字符串:返回拼音首字符 eg. 测试字符串 => CSZFC
* 中英混合串: 返回拼音首字符和英文 eg. 我i我j => WIWJ
* eg.
* $py = new str2PY();
* $result = $py->getInitials('啊吧才的饿飞就好i就看了吗你哦平去人是他uv我想一在');
*/
class str2PY
{
private $_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',
);
private $_charset = null;
/**
* 构造函数, 指定需要的编码 default: utf-8
* 支持utf-8, gb2312
*
* @param unknown_type $charset
*/
public function __construct( $charset = 'utf-8' )
{
$this->_charset = $charset;
}
/**
* 中文字符串 substr
*
* @param string $str
* @param int $start
* @param int $len
* @return string
*/
private function _msubstr ($str, $start, $len)
{
$start = $start * 2;
$len = $len * 2;
$strlen = strlen($str);
$result = '';
for ( $i = 0; $i < $strlen; $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++;
}
return $result;
}
/**
* 字符串切分为数组 (汉字或者一个字符为单位)
*
* @param string $str
* @return array
*/
private function _cutWord( $str )
{
$words = array();
while ( $str != "" )
{
if ( $this->_isAscii($str) ) {/*非中文*/
$words[] = $str[0];
$str = substr( $str, strlen($str[0]) );
}else{
$word = $this->_msubstr( $str, 0, 1 );
$words[] = $word;
$str = substr( $str, strlen($word) );
}
}
return $words;
}
/**
* 判断字符是否是ascii字符
*
* @param string $char
* @return bool
*/
private function _isAscii( $char )
{
return ( ord( substr($char,0,1) ) < 160 );
}
/**
* 判断字符串前3个字符是否是ascii字符
*
* @param string $str
* @return bool
*/
private function _isAsciis( $str )
{
$len = strlen($str) >= 3 ? 3: 2;
$chars = array();
for( $i = 1; $i < $len -1; $i++ ){
$chars[] = $this->_isAscii( $str[$i] ) ? 'yes':'no';
}
$result = array_count_values( $chars );
if ( empty($result['no']) ){
return true;
}
return false;
}
/**
* 获取中文字串的拼音首字符
*
* @param string $str
* @return string
*/
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->_isAscii($word) ) {/*非中文*/
$result[] = $word;
continue;
}
$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));
}
private function _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 '-'; /*其他*/
}
} /**
* 查找需要的汉字内码(gb2312) 对应的拼音字符( 二分法 )
*
* @param int $code
* @return int
*/
private function _search( $code )
{
$data = array_keys($this->_pinyins);
$lower = 0;
$upper = sizeof($data)-1;
$middle = (int) round(($lower + $upper) / 2);
if ( $code < $data[0] ) return -1;
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;
}
}
}
} $py = new str2PY();
$result = $py->getInitials('#吴hao2ewe222^儋,泸,漯,濮,豪放(号1啊吧才的饿飞就好i就看了吗你哦平去人是他uv我想一在');
var_dump($result);
?>

php将汉字转换为拼音和得到词语首字母(一)的更多相关文章

  1. php将汉字转换为拼音和得到词语首字母(三)

    <?php function getfirstchar($s0){ $fchar = ord($s0{0}); if($fchar >= ord("A") and $f ...

  2. php将汉字转换为拼音和得到词语首字母(四)

    <?php function getfirstchar($s0){ $firstchar_ord=ord(strtoupper($s0{0})); if (($firstchar_ord> ...

  3. php将汉字转换为拼音和得到词语首字母(二)

    <?php class Pinyin{ private $_outEncoding = "GB2312"; public function getPinyin($str,$p ...

  4. swift把汉字转换为拼音,并且截取首字母做索引用

    var transformContents = CFStringCreateMutableCopy(nil, 0, "咋啊的看到回复阿斯顿发货发哦iasdifas")CFStrin ...

  5. Swift - 把汉字转换为拼音,并且截取首字母做索引用

    var transformContents = CFStringCreateMutableCopy(nil, 0, "咋啊的看到回复阿斯顿发货发哦iasdifas") CFStri ...

  6. MySQL按照汉字的拼音排序、按照首字母分类

    项目中有时候需要按照汉字的拼音排序,比如联系人列表.矿物分类等,有的还需要按拼音字母从A到Z分类显示. 如果存储汉字的字段编码使用的是GBK字符集,因为GBK内码编码时本身就采用了拼音排序的方法(常用 ...

  7. JAVA实现汉字转换为拼音 pinyin4j/JPinyin

    在项目中经常会遇到需求用户输入汉字后转换为拼音的场景,比如说通讯录,就会要求按名字首字符发音排序,如果自己写实现这方面的功能是个很好大的工程,还好网上有公开的第三方jar支持转换,结合网上很多前辈的代 ...

  8. iOS将汉字转换为拼音

    将汉字转换为拼音 - (NSString *)chineseToPinyin:(NSString *)chinese withSpace:(BOOL)withSpace { CFStringRef h ...

  9. 使用PinYin4j.jar将汉字转换为拼音

    package com.Test.util; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j ...

随机推荐

  1. (转) 共享个很棒的vim配置

    发现了一个很棒的vim配置方法,现在共享给大家. https://github.com/kepbod/ivim   ivim - The Vim Distribution of Xiao-Ou Zha ...

  2. mysql常用函数汇总(分享)

    以下是对mysql中的常用函数进行了汇总介绍.需要的朋友可以过来参考下. 一.数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x ...

  3. Jmeter常见用法

    Jmeter (底层语言是Java)  单进程 Loadrunner (底层语言是C) 多进程 性能更好,更稳定 Tomcat  线程模式(与Java有关的都是单进程) lr的支持最大并发  跟lic ...

  4. 每日英语:Can Going In and Out of Air Conditioning Cause Colds?

    For most people, summer involves numerous daily shifts between scorching outdoor heat and frosty air ...

  5. 这个BUG你遇到过吗

    今天做项目的时候,当我根据文档集成极光推送的时候,需要导入一些framework 然后我用真机iPhone5c调试的时候,出错 程序停止到这里了,而且,点击下一步,程序并没有什么反应,各位大神有知道原 ...

  6. jquery,checkbox无法用attr()二次勾选

    今晨,漂亮的测试妹妹提了个奇怪的bug,说我一功能checkbox时隐时现,比如第一次打开有勾选,第n次打开可能就不选了. 想到与美女有亲密接触机会,马上鸡动起来. 经过偶层层抽次剥茧(da da j ...

  7. eclipse的remote search

    一般你希望以部分文件名作为关键字的时候,可以选择这个搜索选项,当然你也可以选择操作系统自带的搜索功能

  8. LeetCode: Set Matrix Zeroes 解题报告

    Set Matrix ZeroesGiven a m x n matrix, if an element is 0, set its entire row and column to 0. Do it ...

  9. javascript 中XMLHttpRequest 实现前台向后台的交互

    使用XMLHttpRequest对象分为4部完成: 1.创建XMLHttpRequest组建 2.设置回调函数 3.初始化XMLHttpRequest组建 4.发送请求

  10. java日期工具类DateUtil

    一名优秀的程序员,不仅需要有着丰富解决问题的方案,还需要的便是代码的沉淀,这不仅有助于自己快速的开发程序,也有利于保证程序的健壮.那如何才能沉淀自己的”代码“呢?从自己编写util开始其实就是一个不错 ...