08年写的一个获取首字母的程序 , 有网友写邮件提到程序bug的问题, 抽了点时间看了一下,把bug给修正了一下

/**

* created by wangbinandi@gmail.com at 2008-12-29 21:12

* 汉字拼音首字母工具类

* 注: 英文的字串:不变返回(包括数字) eg .abc123 => abc123

* 中文字符串:返回拼音首字符 eg. 王小明 => WXM

* 中英混合串: 返回拼音首字符和英文 eg. 我i我j => WIWJ

* eg.

* $py = new PYInitials();

* $result = $py->getInitials('王小明');

*/

class PYInitials

{

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',

215249 => 'Z',

);

private $_charset = null;

/**

* 构造函数, 指定需要的编码 default: utf-8

* 支持utf-8, gb2312

*

* @param unknown_type $charset

*/

public function __construct( $charset = 'gb2312' )

{

$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;

// 排除非一级汉字

if ($code < $data[0] || $code > $data[23]) return -1;

for (;;) {

if ( $lower > $upper ){

return $data[$lower-1];

}

$middle = (int) round(($lower + $upper) / 2);

if ( !isset($data[$middle]) ) {

return -1;

}

if ( $data[$middle] < $code ){

$lower = (int)$middle + 1;

}else if ( $data[$middle] == $code ) {

return $data[$middle];

}else{

$upper = (int)$middle - 1;

}

}// end for

}

}

?>

php取名字第一个字,php 获取姓名拼音首字母相关推荐

  1. php 获取姓名拼音首字母

    来源url:http://www.open-open.com/home/space-926-do-blog-id-5580.html <?php /*** created by wangbina ...

  2. 在delphi 7中实现获取汉字拼音首字母

    公司的餐饮系统出品的助记码,还没实现自动从出品名称获取汉字拼音首字母. 所以在网上找了三种解决方法, 一种是kaguo 的使用常用汉字拼音查找方法,这种代码十分简单,实现方便,但是这种代码仅仅是一级字 ...

  3. php获取汉字的首字母,php获取汉字拼音首字母的方法

    现实中我们经常看到这样的说明,排名不分先后,按姓名首字母进行排序.这是中国人大多数使用的排序方法.那么在php程序中该如何操作呢? 下面就分享一下在php程序中获取汉字拼音的首字母的方法,在网上搜到的 ...

  4. 【C#】获取汉字拼音首字母和全拼

    文章目录 利用CJK统一表意符号获取首字母 获取首字母和全拼 另附sql server解决方案 来源 java的同学可以了解下pinyin4j,js可以了解ChinesePY.js 获取拼音的意义多在 ...

  5. php获取拼音首字母排序,PHP获取汉字拼音首字母的方法

    PHP获取汉字拼音首字母的方法: function getfirstchar($s0){ $fchar = ord($s0{0}); if($fchar >= ord("A" ...

  6. java怎么获取中文首字母_Java如何获取中文拼音首字母的方法介绍

    下面小编就为大家带来一篇java获取中文拼音首字母的实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 如下所示: import net.sourceforge.pin ...

  7. 按照姓名拼音首字母排序

    按照姓名拼音首字母排序 https://blog.csdn.net/YezhanCHN/article/details/119880298

  8. java 拼音首字母_java获取中文拼音首字母的实例

    导读热词 正文 如下所示: import net.sourceforge.pinyin4j.PinyinHelper; public class PinyinHelperUtil { /** * 得到 ...

  9. 姓名拼音首字母缩写_公司首字母缩写

    姓名拼音首字母缩写 首字母缩略词可以很容易地提醒您扩展主题的引用,并且显然可以以某种方式对其进行概括,这尤其有用,尤其是当您可以将它们用作新词来快速表达关系并直截了当地时(例如提及SLA,KPI,SO ...

  10. 姓名拼音首字母缩写_企业开发人员,首字母缩写词和歧视

    姓名拼音首字母缩写 在过去的几年中,我的客户从大多数中型市场公司和一些初创公司转变为几乎完全是初创公司,这种转变导致客户要求的语言范围更加广泛. 在我职业生涯的前10年中,我的业务约占Java的95% ...

最新文章

  1. lighttpd+PHP安装
  2. 可靠性测试-故障模型库
  3. 关于创业公司产品开发原则
  4. 解密谷歌机器学习工程最佳实践——机器学习43条军规 翻译 2017年09月19日 10:54:58 98310 本文是对Rules of Machine Learning: Best Practice
  5. 企业移动办公市场格局将定 随办如何突围?
  6. spring配置详解-初始化销毁方法
  7. 道路交通安全违法行为图像取证技术规范_海康移动取证方案中的设备介绍
  8. Python数据类型-元组类型
  9. SqlServer表中两条全然同样的记录,怎样删除当中1条
  10. oracle11g临时表,oracle11G的临时表空间
  11. 在.NET中探测U盘的插入/拔出
  12. SQL 中GROUP BY 、ROLLUP、CUBE 关系和区别
  13. 亲身经历:如何判断一个字符在a/z之前?
  14. 推荐一款开源游戏开发平台
  15. 2022年CXO领导力峰会暨IT东方会技术高管年会
  16. 免费下载百度文库等文档
  17. 计算机系统_数据表示实验
  18. 根据当前谷歌浏览器版本获取或更新更新chromedriver.exe
  19. 灰色预测残差修正 matlab,基于残差修正灰色预测模型的长期电力负荷预测方法与流程...
  20. LeetCode,无它,唯手熟尔(二)

热门文章

  1. HTML5项目实战之旅行社网站——移动端流体布局
  2. 汽车自动驾驶是人工智能吗,自动驾驶是人工智能
  3. 基于javaweb+jsp的在线书城书店系统(java+jdbc+Servlet+mysql)
  4. 山寨智能机多采用盗版Windows Mobile系统
  5. 新冠最新研究进展(2021年11月)
  6. 监控显示服务器超时,监控连接服务器超时怎么解决
  7. 2021-10-09《星科快报》第一期 何为元宇宙
  8. 使用ACCESS数据库时出现“操作必须使用一个可更新的查询”的解决办法
  9. 联想拯救者Y7000p+Nvidia rtx2060 显卡驱动安装
  10. Linux SPI驱动(Linux驱动开发篇)