sort()为日语

时间:2011-04-18 03:30:39

标签: php unicode localization collation cjk

如果我将当前的语言环境设置为日语,我该怎样才能使日语字符的优先级始终高于非日语字符。例如,现在英文字符将始终出现在片假名字符之前。我该如何扭转这种影响?

很抱歉不太清楚。正如您所见here

最终结果有Java,NVIDIA和Windowsファイアウォール。 排在日本人物之前的前三名。是否有可能在最后有这些?

2 个答案:

答案 0 :(得分:6)

使用usort()代替sort(),以便您可以按照自己的方式定义比较条件。

试试这个简单的方法。我使用here中的示例尝试了它,它可以工作。

  function mccompare($a, $b) {
    $fca = ord(substr($a, 0, 1)); $fcb = ord(substr($b, 0, 1));
    if (($fca >= 127 && $fcb >= 127) || ($fca < 127 && $fcb < 127))
      $res = $a > $b ? 1 : -1; 
    else 
      $res = $a > $b ? -1 : 1;
    return $res;
    }

  usort ($your_array, "mccompare");

所以对于这个例子

  setlocale(LC_COLLATE, "jpn");

  $your_array = array ("システム", "画面", "Windows ファイウォール",
      "インターネット オプション",  "キーボード", "メール", "音声認識", "管理ツール",
      "自動更新", "日付と時刻", "タスク", "プログラムの追加と削除", "フォント",
      "電源オプション", "マウス", "地域と言語オプション", "電話とモデムのオプション",
      "Java", "NVIDIA");

  usort ($your_array, "mccompare");
  print_r($your_array);

它返回类似

的数组
Array
(
    [0] => インターネット オプション
    [1] => キーボード
    [2] => システム
    [3] => タスク
    [4] => フォント
    [5] => プログラムの追加と削除
    [6] => マウス
    [7] => メール
    [8] => 地域と言語オプション
    [9] => 日付と時刻
    [10] => 画面
    [11] => 管理ツール
    [12] => 自動更新
    [13] => 電源オプション
    [14] => 電話とモデムのオプション
    [15] => 音声認識
    [16] => Java
    [17] => NVIDIA
    [18] => Windows ファイウォール
)

注意:这只是我对此问题的快速解决方案,并不是一个完美的解决方案。它基于检查比较字符串中的第一个字节,但您总是可以在其中进行一些努力并改进此功能以检查所有多字节字符与Unicode,然后确定$ a&lt; = $ b或$ a&gt; $ b。< / p>

希望它适合你!

答案 1 :(得分:2)

最终,PHP的sort()将它留给底层的libc来实现排序。并且如文章和我的评论所示,并非所有libc都以相同的方式排序。如果您需要提供一致的排序规则,则需要使用Collator等使用第三方库的内容。