如何像Excel一样对日语进行排序

时间:2017-11-22 09:00:28

标签: php excel sorting cjk

我想像excel中的排序功能一样对日语单词(汉字)进行排序。 我已经尝试了很多方法来在PHP中对日文文本进行排序,但结果并不像excel中的结果那样100%。

首先。我尝试使用这个lib(https://osdn.net/projects/igo-php/)将Kanji转换为片假名,但有些情况与excel不同。 我想对这些词进行排序ASC

けやきの家

高森台病院

みのりの里

我的结果:

けやきの家

高森台病院

みのりの里

Excel结果:

けやきの家

みのりの里

高森台病院

其次我尝试使用此功能

 mb_convert_kana($text, "KVc", "utf-8");

上述文字的排序结果是正确的,但它包含一些不正确的案例

米田病院

米田病院

高森台病院

我的结果:

米田病院

米田病院

高森台病院

Excel结果:

高森台病院

米田病院

米田病院

你对这个有什么想法吗? (对不起我的英语不好 ) 。谢谢

1 个答案:

答案 0 :(得分:2)

首先,日本汉字不可分类。您可以按其代码编号进行排序,但该顺序没有任何意义。

你使用Igo(或任何其他形态分析库)听起来不错,但它不是完美的。你的第一个排序结果对我来说似乎很好。为什么要按Excel顺序对它们进行排序?

在Excel中,如果单元格在用户最初键入日语IME(输入法编辑器)时记住其语音符号,则该语音将用于排序。这意味着,由于并非所有单元格都可以在IME上手动输入,因此某些单元格可能没有信息如何读取这些汉字。因此,在Excel上对Kanji-s进行排序的结果可能非常难以预测。 (如果严重需要排序,通常我们会添加另一个yomigana字段,无论是平假名还是片假名,并按该列排序。)

第二种方法mb_convert_kana()完全脱离了点。该功能是对平假名/片假名进行标准化,因为历史原因有两组字母(全宽假名和半宽假名)。将该功能应用于日文文本只会改变假名部分。如果这使你的期望得到满足,那一定是巧合。

您必须先定义客户需要的Excel日语排序顺序。如果清楚的话,我很乐意帮助你。

[更新]

正如操作评论,mb_convert_kana()是对混合的平假名/片假名进行排序。为此,我建议使用php_intl Collat​​or。例如,

<?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)都知道如何使用多种语言对字母表进行排序,因此您无需编写它。

并且,这并没有解决原始问题,汉字排序。