PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法


Posted in PHP onMay 03, 2017

本文实例讲述了PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法。分享给大家供大家参考,具体如下:

ICU(International Components for Unicode)里提供了transliterator(直译器),
可以很方便把其他语言(比如简体中文)转为拉丁文表示:
http://cn2.php.net/manual/zh/transliterator.transliterate.php
Transliterator: allows getting latin representation of strings in various languages.

<?php
//文件编码要求是Unicode
header('Content-Type: text/html; charset=utf-8');
echo transliterator_transliterate('Any-Latin', '中华有为');
//输出 zhōng huá yǒu wèi
echo transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', '中华有为');
//输出 zhong hua you wei
echo transliterator_transliterate('Any-Latin; Latin-ASCII; Upper()', '中华有为');
//输出 ZHONG HUA YOU WEI
echo transliterator_transliterate('Any-Latin', '重阳');
//输出 zhòng yáng (错误,多音字还是坑)

苹果上的CFStringTransform/kCFStringTransformToLatin汉字转拼音也是通过ICU transform实现的:

http://userguide.icu-project.org/transforms/general#TOC-ICU-Transliterators
http://nshipster.com/cfstringtransform/

使用php5-intl(依赖ICU:libicu52)的简体中文(zh_CN)排序器collator按拼音排序:

http://cn2.php.net/manual/zh/collator.sort.php
php-src/ext/intl --enable-intl --with-icu-dir=DIR

相关: MySQL数据表排序规则COLLATE=utf8_general_ci

<?php
header('Content-Type: text/html; charset=utf-8');
$coll = collator_create('zh_CN');
$arr = array('中国','华山','华夏','中华','重阳','重量','b','a',2,1);
collator_sort($coll, $arr);
var_export($arr);
/*输出(可见汉字按照拼音排序,但不能识别多音字"重"):
array (
 0 => 'a',
 1 => 'b',
 2 => '华山',
 3 => '华夏',
 4 => '中国',
 5 => '中华',
 6 => '重量',
 7 => '重阳',
 8 => 1,
 9 => 2,
)
*/

如果元素1和2加上引号变成字符串类型的话,则1和2排序后会出现在开头.

查看已经安装的软件包目录文件结构:

dpkg -L libicu52:amd64
/usr/lib/x86_64-linux-gnu/libicu*
/usr/lib/x86_64-linux-gnu/libicudata.so.52.1 动态库23MB
/usr/lib/x86_64-linux-gnu/libicudata.a       静态库23MB

Windows上则是:

php\icu*.dll
php\ext\php_intl.dll

下面实现了常用的按汉字拼音首字母分组排序的功能:

<?php
header('Content-Type: text/html; charset=utf-8');
$arr = array('百度知道','阿里云','百度百科','阿里巴巴');
$coll = collator_create('zh_CN');
collator_sort($coll, $arr);
var_export($arr);
//输出 array ( 0 => '阿里巴巴', 1 => '阿里云', 2 => '百度百科', 3 => '百度知道', )
$tmp = array();
foreach($arr as $v) {
 $pinyin = transliterator_transliterate('Any-Latin; Latin-ASCII; Upper()', $v);
 $tmp[substr($pinyin, 0, 1)][] = $v;
}
var_export($tmp);
/*输出
array (
 'A' =>
 array (
  0 => '阿里巴巴',
  1 => '阿里云',
 ),
 'B' =>
 array (
  0 => '百度百科',
  1 => '百度知道',
 ),
)
*/

附:

ls命令,Linux和Windows的文件管理器,显示如下:

1  2  a  b  华山  华夏  中国  中华  重量  重阳

数字,字母,汉字(按拼音排序,但不能识别多音字)

汉字方面,下面的自然排序跟上面有所不同:

<?php
header('Content-Type: text/plain; charset=utf-8');
$arr = array('中国','华山','华夏','中华','重阳','重量','b','a',2,1);
natsort($arr); // 等价于 uasort($arr, function($a, $b) { return strnatcmp($a, $b); });
var_export($arr);
/*输出(自然排序下汉字并没有按照拼音进行排序):
array (
 9 => 1,
 8 => 2,
 7 => 'a',
 6 => 'b',
 3 => '中华',
 0 => '中国',
 2 => '华夏',
 1 => '华山',
 5 => '重量',
 4 => '重阳',
)
*/

几种排序的比较:

<?php
header('Content-Type: text/plain; charset=utf-8');
$arr = explode(' ', '1 11 111 112 12 121 122 a aa aaa aab ab aba abb 阿里 百度 中 中国 中国国 中国中 中中 中中国 中中中');
shuffle($arr); //打乱数组
//collator_sort(collator_create('zh_CN'), $arr);
//usort($arr, function($a, $b) { return strnatcmp($a, $b); });
usort($arr, function($a, $b) { return strcmp($a, $b); });
echo implode(' ',$arr);
exit();
?>

ls排序:

1 11 111 112 12 121 122 a aa aaa aab ab aba abb 阿里 百度 中 中国 中国国 中国中 中中 中中国 中中中

collator_sort(zh_CN)排序(类似Windows/Linux桌面文件管理器里的默认按名称上升排列):

1 11 12 111 112 121 122 a aa aaa aab ab aba abb 阿里 百度 中 中国 中国国 中国中 中中 中中国 中中中

strnatcmp排序:

1 11 12 111 112 121 122 a aa aaa aab ab aba abb 中 中中 中中中 中中国 中国 中国中 中国国 百度 阿里

strcmp排序:

1 11 111 112 12 121 122 a aa aaa aab ab aba abb 中 中中 中中中 中中国 中国 中国中 中国国 百度 阿里

PHP 相关文章推荐
一个好用的分页函数
Nov 16 PHP
推荐个功能齐全的发送PHP邮件类
Jan 03 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
Oct 25 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
Aug 09 PHP
深入for,while,foreach遍历时间比较的详解
Jun 08 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
Nov 13 PHP
Yii框架中memcache用法实例
Dec 03 PHP
php正则替换处理HTML页面的方法
Jun 17 PHP
php中的单引号、双引号和转义字符详解
Feb 16 PHP
PHP实现腾讯与百度坐标转换
Aug 05 PHP
PHP递归的三种常用方式
Feb 28 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
php中的异常和错误浅析
May 03 #PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 #PHP
利用php-cli和任务计划实现订单同步功能的方法
May 03 #PHP
php删除数组指定元素实现代码
May 03 #PHP
在php7中MongoDB实现模糊查询的方法详解
May 03 #PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 #PHP
php 使用curl模拟ip和来源进行访问的实现方法
May 02 #PHP
You might like
输出控制类
2006/10/09 PHP
PHP file_get_contents 函数超时的几种解决方法
2009/07/30 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
php实现评论回复删除功能
2017/05/23 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
javascript FormatNumber函数实现方法
2008/12/30 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
详解vue axios中文文档
2017/09/12 Javascript
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
React 使用recharts实现散点地图的示例代码
2018/12/07 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
python使用PyQt5的简单方法
2019/02/27 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
生物化工工艺专业应届生求职信
2013/10/08 职场文书
狼和鹿教学反思
2014/02/05 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
SQL Server 中的事务介绍
2022/05/20 SQL Server