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 相关文章推荐
用php和MySql来与ODBC数据连接
Oct 09 PHP
修改PHP的memory_limit限制的方法分享
Feb 21 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
php判断页面是否是微信打开的示例(微信打开网页)
Apr 25 PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 PHP
codeigniter中view通过循环显示数组数据的方法
Mar 20 PHP
PHP获取二维数组中某一列的值集合
Dec 25 PHP
PHP基于单例模式实现的mysql类
Jan 09 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 PHP
php 中htmlentities导致中文无法查询问题
Sep 10 PHP
PHP使用观察者模式处理异常信息的方法详解
Sep 24 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
提升PHP执行速度全攻略(下)
2006/10/09 PHP
php生成WAP页面
2006/10/09 PHP
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
2019/05/29 PHP
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
vant picker+popup 自定义三级联动案例
2020/11/04 Javascript
python实现的系统实用log类实例
2015/06/30 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
2018/07/04 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
pycharm新建一个python工程步骤
2019/07/16 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
用友笔试题目
2016/10/25 面试题
体育教育毕业生自荐信
2013/11/21 职场文书
《盲人摸象》教学反思
2014/02/16 职场文书
国旗下讲话演讲稿
2014/05/08 职场文书
健康状况证明书
2014/11/26 职场文书
2014年学校禁毒工作总结
2014/12/23 职场文书
利用Python第三方库实现预测NBA比赛结果
2021/06/21 Python