我想像excel中的排序功能一样对日语单词(汉字)进行排序。 我已经尝试了很多方法来在PHP中对日文文本进行排序,但结果并不像excel中的结果那样100%。
首先。我尝试使用这个lib(https://osdn.net/projects/igo-php/)将Kanji转换为片假名,但有些情况与excel不同。 我想对这些词进行排序ASC
けやきの家
高森台病院
みのりの里
我的结果:
けやきの家
高森台病院
みのりの里
Excel结果:
けやきの家
みのりの里
高森台病院
其次我尝试使用此功能
mb_convert_kana($text, "KVc", "utf-8");
上述文字的排序结果是正确的,但它包含一些不正确的案例
米田病院
米田病院
高森台病院
我的结果:
米田病院
米田病院
高森台病院
Excel结果:
高森台病院
米田病院
米田病院
你对这个有什么想法吗? (对不起我的英语不好 ) 。谢谢答案 0 :(得分:2)
首先,日本汉字不可分类。您可以按其代码编号进行排序,但该顺序没有任何意义。
你使用Igo(或任何其他形态分析库)听起来不错,但它不是完美的。你的第一个排序结果对我来说似乎很好。为什么要按Excel顺序对它们进行排序?
在Excel中,如果单元格在用户最初键入日语IME(输入法编辑器)时记住其语音符号,则该语音将用于排序。这意味着,由于并非所有单元格都可以在IME上手动输入,因此某些单元格可能没有信息如何读取这些汉字。因此,在Excel上对Kanji-s进行排序的结果可能非常难以预测。 (如果严重需要排序,通常我们会添加另一个yomigana字段,无论是平假名还是片假名,并按该列排序。)
第二种方法mb_convert_kana()完全脱离了点。该功能是对平假名/片假名进行标准化,因为历史原因有两组字母(全宽假名和半宽假名)。将该功能应用于日文文本只会改变假名部分。如果这使你的期望得到满足,那一定是巧合。
您必须先定义客户需要的Excel日语排序顺序。如果清楚的话,我很乐意帮助你。
[更新]
正如操作评论,mb_convert_kana()是对混合的平假名/片假名进行排序。为此,我建议使用php_intl Collator。例如,
<?php
// demo: Japanese(kana) sort by php_intl Collator
if (version_compare(PHP_VERSION, '5.3.0', '<')) {
exit ('php_intl extension is available on PHP 5.3.0 or later.');
}
if (!class_exists('Collator')) {
exit ('You need to install php_intl extension.');
}
$collator = new Collator('ja_JP');
$textArray = [
'カキクケコ',
'日本語',
'アアト',
'Alphabet',
'アイランド',
'はひふへほ',
'あいうえお',
'漢字',
'たほいや',
'さしみじょうゆ',
'Roma',
'ラリルレロ',
'アート',
];
$result = $collator->sort($textArray);
if ($result === false) {
echo "sort failed" . PHP_EOL;
exit();
}
var_dump($textArray);
这对平假名/片假名混合文本数组进行排序。结果在这里。
array(13) {
[0]=>
string(8) "Alphabet"
[1]=>
string(4) "Roma"
[2]=>
string(9) "アート"
[3]=>
string(9) "アアト"
[4]=>
string(15) "あいうえお"
[5]=>
string(15) "アイランド"
[6]=>
string(15) "カキクケコ"
[7]=>
string(21) "さしみじょうゆ"
[8]=>
string(12) "たほいや"
[9]=>
string(15) "はひふへほ"
[10]=>
string(15) "ラリルレロ"
[11]=>
string(6) "漢字"
[12]=>
string(9) "日本語"
}
您不需要自己规范化它们。 PHP(虽然使用扩展名为php_intl)和数据库(如MySQL)都知道如何使用多种语言对字母表进行排序,因此您无需编写它。
并且,这并没有解决原始问题,汉字排序。