<?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实现将汉字转换为拼音及获取词语首字母的方法...

    本文实例讲述了PHP实现将汉字转换为拼音及获取词语首字母的方法.分享给大家供大家参考,具体如下: 最近要开发将汉字转换为拼音和得到首字的功能记录下来哈子:呵呵~ class Pinyin{ priva ...

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

    最近要开发将汉字转换为拼音和得到首字的功能记录下来哈子:呵呵~ class Pinyin{private $_outEncoding = "GB2312";public funct ...

  3. .net core通过PinYinConverterCore实现汉字转拼音,获取中文字符串首字母

    文章目录 一.事故现场 二.解决方法 1.安装方法 2.代码示例 #中文转拼音 #获取中文字符串首字母 一.事故现场 项目之前使用的.net framework,可以通过引用 Microsoft.In ...

  4. java汉字转拼音和获取汉语拼音首字母

    需要加入的jar包 <!-- pinyin4j --><dependency><groupId>com.belerweb</groupId><ar ...

  5. mysql转拼音首字母大写_Mysql中文汉字转拼音的实现  mysql首字母转化为大写

    这篇文章主要介绍了Mysql中文汉字转拼音的实现,并且每个汉字会转换全拼,使用Mysql自定义函数实现,需要的朋友可以参考下 第一步:我们将在mysql中新建必要的函数 一.创建拼音对照表 -- 创建 ...

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

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

  7. uni-app 汉字转拼音 搜索和按首字母排序页面

    <template><view class="outer"><view class="search"><view> ...

  8. 探索PinYin4j.jar将汉字转换为拼音的基本用法

    将汉字转换为拼音在Android开发中是个很常见的问题.例如:在android手机应用开发中,要查询联系人的姓名,通常都是用拼音进行查询的. Pinyin4j是一个功能强悍的汉语拼音工具包,是sour ...

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

    转载自  JAVA实现汉字转换为拼音 pinyin4j/JPinyin 在项目中经常会遇到需求用户输入汉字后转换为拼音的场景,比如说通讯录,就会要求按名字首字符发音排序,如果自己写实现这方面的功能是个 ...

最新文章

  1. java 对象内存布局_Java--对象内存布局
  2. 南京大学发布WebCaricature漫画人脸识别数据集
  3. 无线充电系统在输出部分采用LCC拓扑结构综述研究
  4. iphone开发 如何在NSMutableDictionary中放入基本数据类型
  5. .NET Core 使用MailKit发送电子邮件
  6. 计算机组装维护文献,组装计算机论文,关于《计算机组装维护》课程教学相关参考文献资料-免费论文范文...
  7. Android Studio查看应用数字签名-android学习之旅(76)
  8. servlet,session对象的生命周期
  9. URAL 1132 Square Root(二次剩余定理)题解
  10. JAVA语言程序设计课后习题----第八单元解析(仅供参考)
  11. 安装驱动省心办法:驱动总裁
  12. RTL8762DK UART(二)
  13. Linux系统swap分区扩容,swap分区扩容
  14. 在img的图片上添加文字
  15. 【软考 系统架构设计师】嵌入式系统⑤ 嵌入式系统开发与设计
  16. 黑苹果Macos 恢复系统后按下允许扩展性内核构建之后无限重启无法开机解决办法之一
  17. STM32 使用CubeMX HAL库快速生成USBVCP虚拟串口工程
  18. MySQL--变量、if语句、while循环以及存储过程的使用
  19. 一、采样频率到底是选择2倍还是10倍?让我用python来给你展示
  20. 花卉识别--五个类别的检测

热门文章

  1. fiddler限速/弱网模拟
  2. linux链接器脚本,vmlinux-lds 连接器脚本
  3. java trunc函数_TRUNC函数的用法
  4. java中选择结构有哪些_Java中的选择结构
  5. java 加载shellcode_MSF-Shellcode生成和使用
  6. html计算一个数组所有元素的和,函数bsxfun,两个数组间元素逐个计算的二值操作...
  7. 远程服务器格式化,怎么远程服务器做ghost备份图解
  8. Docker组队学习(三)
  9. 有趣的python代码实例_Python之路:200个Python有趣的小例子一网打尽
  10. 八皇后时间复杂度_九章算法 | N皇后问题