使用排序规则对数组进行排序

Dan*_*Dan 8 php locale localization collation

我有一个包含法语单词的数组:['États-Unis','Espagne'等]我希望根据其语言环境按字母顺序排序(fr_FR)

我正在使用以下代码:

$collator = new Collator('fr-FR');
echo $collator->getErrorMessage();
$collator->asort($array);
Run Code Online (Sandbox Code Playgroud)

但我收到错误U_USING_DEFAULT_WARNING我假设使用英语或其他一些语言环境.更重要的是,阵列没有正确排序(美国出现在西班牙之前,我预计会发生相反的情况)

我安装了intl包,我的系统有相应的语言环境(Ubuntu)

$locale -a
C
C.UTF-8
en_US.utf8
es_ES.utf8
fr_FR
fr_FR.iso88591
fr_FR.utf8
POSIX
Run Code Online (Sandbox Code Playgroud)

我在构造Collat​​ion对象时尝试了不同的组合,没有任何好的结果:"fr-FR","fr-FR.UTF8"等.

还有什么我想念的吗?

may*_*din 5

根据这篇博客文章,对于cote,coté,côtecôté(已用英语排序)这两个词,法语的排序顺序是:cote,côte,cotécôté.下面的代码对法语排序规则中的单词进行排序:

$words = array('cote', 'coté', 'côte',  'côté');
print_r($words);

$collator = new Collator('fr_FR');

// print info about locale
echo 'French Collation ' . (($collator->getAttribute(Collator::FRENCH_COLLATION) ==    Collator::ON) ? 'On' : 'Off') . "\n";
echo $collator->getLocale(Locale::VALID_LOCALE) . "\n";
echo $collator->getLocale(Locale::ACTUAL_LOCALE) . "\n";

$collator->asort($words);

print_r($words);
Run Code Online (Sandbox Code Playgroud)

打印结果如下:

Array
(
    [0] => cote
    [1] => coté
    [2] => côte
    [3] => côté
)
French Collation On
fr_FR
fr
Array
(
    [0] => cote
    [2] => côte
    [1] => coté
    [3] => côté
)
Run Code Online (Sandbox Code Playgroud)

在同一篇博文中,作者说:

[...]变音符号从右到左而不是从左到右进行评估.因此,côte出现在coté之前,而不是像在英语之类的语言之后那样从左到右进行评估.因为côte这个词在单词末尾的"e"上没有ACUTE,而coté就是.在英语和大多数其他语言中,评估从左侧开始,因此CIRCUMFLEX或"o"上缺少CIRCUMFLEX是排序的控制因素.

所以,如果你有一个包含西班牙语美国语的数组,它们将具有相同的英语和法语顺序.

您还应该记住,该asort方法维护数组的索引关联.看到不同:

asort:
Array
(
    [0] => cote
    [2] => côte
    [1] => coté
    [3] => côté
)

sort:
Array
(
    [0] => cote
    [1] => côte
    [2] => coté
    [3] => côté
)
Run Code Online (Sandbox Code Playgroud)

关于U_USING_DEFAULT_WARNING

根据此API文档:

U_USING_DEFAULT_WARNING表示使用了默认的语言环境数据; 既不能找到所请求的区域设置,也不能找到任何后备区域设置.

例如,当我使用fr_FR语言环境时,我得到一个U_USING_FALLBACK_WARNING,表示使用了回退语言环境,在本例中是语言环境fr.

语言环境

看起来,你的计算机不支持法语(或者确实如此,但不管怎么说PHP都不能使用它然后回退到默认语言),即使命令locale -a显示法语包.我有一些你可以尝试的建议.

首先,列出所有支持的语言环境:

cat /usr/share/i18n/SUPPORTED 
Run Code Online (Sandbox Code Playgroud)

现在,生成您需要的语言:

sudo locale-gen fr_FR.UTF-8
sudo locale-gen fr_FR.ISO-8859-1
sudo dpkg-reconfigure locales
Run Code Online (Sandbox Code Playgroud)

如果它不起作用,请尝试安装包language-pack-frlanguage-support-fr并再次生成语言.

这个问题很奇怪.我有一个使用Ubuntu 11.04和PHP 5.3.8的虚拟机,它在我的Debian 6中运行得很好,而且我没有安装任何软件包或配置任​​何东西.