Home  >  Article  >  Backend Development  >  PHP uses ICU extension intl to quickly convert Chinese characters to Pinyin and sort by grouping and sorting by the first letter of Pinyin

PHP uses ICU extension intl to quickly convert Chinese characters to Pinyin and sort by grouping and sorting by the first letter of Pinyin

高洛峰
高洛峰Original
2016-11-23 14:15:331839browse

ICU (International Components for Unicode) provides a transliterator,
which can easily convert other languages ​​​​(such as Simplified Chinese) into Latin representation:
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 on Apple is also implemented through ICU transform:
http://userguide.icu-project.org/ transforms/general #TOC-ICU-Transliterators
http://nshipster.com/cfstringtransform/

Simplified Chinese (zh_CN) sorter collator using php5-intl (depends on ICU: libicu52) Sort by pinyin:
http:// cn2.php.net/manual/zh/collator.sort.php
php-src/ext/intl --enable-intl --with-icu-dir=DIR
Related: MySQL data table collation 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,
)

If elements 1 and 2 are changed into string types with quotes, 1 and 2 will appear at the beginning after sorting.
View the directory file structure of the installed software package:
dpkg -L libicu52:amd64
/usr/lib /x86_64-linux-gnu/libicu*
/usr/lib/x86_64-linux-gnu/libicudata.so.52.1 Dynamic library 23MB
/usr/lib/x86_64-linux-gnu/libicudata.a Static library 23MB
On Windows It is:
phpicu*.dll
phpextphp_intl.dll

The following implements the commonly used function of grouping and sorting by the first letter of Chinese pinyin:

<?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;,
  ),
)

Attachment:
ls command, Linux and Windows file managers, as shown below:
1 2 a b Huashan Huaxia China China Weight Double Ninth Festival
Numbers, letters, Chinese characters (sorted by pinyin, but polyphonic characters cannot be recognized)
In terms of Chinese characters, the natural sorting below is different from the above:

<?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;,
)

Comparison of several sortings:

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


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:php object inheritanceNext article:php object inheritance