首頁  >  文章  >  後端開發  >  PHP利用ICU擴充intl快速實現漢字轉拼音以及按拼音首字母分組排序

PHP利用ICU擴充intl快速實現漢字轉拼音以及按拼音首字母分組排序

高洛峰
高洛峰原創
2016-11-23 14:15:331877瀏覽

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(&#39;Content-Type: text/html; charset=utf-8&#39;);

echo transliterator_transliterate(&#39;Any-Latin&#39;, &#39;中华有为&#39;);
//输出 zhōng huá yǒu wèi

echo transliterator_transliterate(&#39;Any-Latin; Latin-ASCII; Lower()&#39;, &#39;中华有为&#39;);
//输出 zhong hua you wei

echo transliterator_transliterate(&#39;Any-Latin; Latin-ASCII; Upper()&#39;, &#39;中华有为&#39;);
//输出 ZHONG HUA YOU WEI

echo transliterator_transliterate(&#39;Any-Latin&#39;, &#39;重阳&#39;);
//输出 zhòng yáng (错误,多音字还是坑)

蘋果上的CFStringTransform/kCFStringTransformToLatin漢字轉拼音也是透過ICU transform. transforms/general#TOC-ICU-Transliterators
http://nshipster.com/cfstringtransform/

使用php5-intl(依賴ICU:libicu52)的簡體中文(zh_CN)排序器collat​​or按拼音排序:
http:// cn2.php.net/manual/zh/collat​​or.sort.php
php-src/ext/intl --enable-intl --with-icu-dir=DIR
相關: MySQL資料表排序規則COLLATE=utf8_general_ci

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

下面實作了常用的按漢字拼音首字母分組排序的功能:

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

附:

ls 1  2  a  b  華山  華夏  中國  中華  重量  重陽

數字,字母,漢字(按拼音排序,但不能識別多音字)
漢字方面,下面的自然排序跟上面有所不同:
re

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:php物件繼承下一篇:php物件繼承