ホームページ  >  記事  >  バックエンド開発  >  PHP は、ICU 拡張機能 intl を使用して、中国語の文字をピンインにすばやく変換し、グループ化してピンインの最初の文字でソートします。

PHP は、ICU 拡張機能 intl を使用して、中国語の文字をピンインにすばやく変換し、グループ化してピンインの最初の文字でソートします。

高洛峰
高洛峰オリジナル
2016-11-23 14:15:331877ブラウズ

ICU (International Components for Unicode) は、他の言語 (簡体字中国語など) をラテン語表現に簡単に変換できる音訳ツールを提供します:
http://cn2.php.net/manual/zh/ transliterator。 transliterate.php
Transliterator: さまざまな言語で文字列のラテン表現を取得できます。Apple の

<?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 変換を通じて実装されています:

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

php5-intl を使用した簡体字中国語 (zh_CN) ソーター コレーター (ICU に依存: libicu52) ピンインによる並べ替え:
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.a 静的ライブラリ 23MB
Windows の場合:
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コマンド、LinuxおよびWindowsファイルマネージャー、表示は次のようになります:
1 2 a b Huashan華夏の中国重九祭
数字、文字、漢字 (ピンインでソートされていますが、多声文字は認識できません)
漢字に関しては、以下の自然なソートは上記とは異なります:

<?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 までご連絡ください。