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 相关文章推荐
类的另类用法--数据的封装
Oct 09 PHP
PHP中动态HTML的输出技术
Oct 09 PHP
调试一段PHP程序时遇到的三个问题
Jan 17 PHP
深入PHP获取随机数字和字母的方法详解
Jun 06 PHP
php中url传递中文字符,特殊危险字符的解决方法
Aug 17 PHP
修改apache配置文件去除thinkphp url中的index.php
Jan 17 PHP
PHP共享内存用法实例分析
Feb 12 PHP
php mysql实现mysql_select_db选择数据库
Dec 30 PHP
PHP实现的二分查找算法实例分析
Dec 19 PHP
PHP设计模式之工厂模式定义与用法详解
Apr 03 PHP
PHP实现的函数重载功能示例
Aug 03 PHP
PHP设计模式之抽象工厂模式实例分析
Mar 25 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读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
json原理分析及实例介绍
2012/11/29 Javascript
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
javascript闭包的理解
2015/04/01 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
如何提高javascript加载速度
2016/12/26 Javascript
JS简单实现移动端日历功能示例
2016/12/28 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
Python中请使用isinstance()判断变量类型
2014/08/25 Python
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
Python RuntimeError: thread.__init__() not called解决方法
2015/04/28 Python
在Python中使用元类的教程
2015/04/28 Python
为Python程序添加图形化界面的教程
2015/04/29 Python
Django中处理出错页面的方法
2015/07/15 Python
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
美国零售商店:Blue&Cream
2017/04/07 全球购物
国际贸易专业推荐信
2013/11/15 职场文书
企业承诺书怎么写
2014/05/24 职场文书
数学系毕业生求职信
2014/05/29 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL
JavaScript实现九宫格拖拽效果
2022/06/28 Javascript