根据这篇博文,对于单词cote、cote、côte和côté(已经用英文排序),法语的排序顺序是:cote、côte、cote和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);
打印结果如下:
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é
)
在同一篇博文中,作者说:
[...] 变音符号是从右到左而不是从左到右评估的。因此côte 出现在coté之前,而不是像英语这样从左到右评估它们的语言中那样。因为单词 côte 在单词末尾的“e”上没有 ACUTE,而coté有。在英语和大多数其他语言中,评估从左侧开始,因此“o”上的 CIRCUMFLEX 或缺少它是排序的控制因素。
因此,如果您有一个包含Spain和US的数组,它们在英语和法语中将具有相同的顺序。
您还应该记住,该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é
)
关于 U_USING_DEFAULT_WARNING
根据此API 文档:
U_USING_DEFAULT_WARNING 表示使用了默认的语言环境数据;既找不到请求的语言环境,也找不到它的任何后备语言环境。
例如,当我使用fr_FR语言环境时,我得到一个 U_USING_FALLBACK_WARNING,这表明使用了一个备用语言环境,在本例中为语言环境fr。
语言环境
看起来,您的计算机不支持法语(或者它支持,但不知何故 PHP 无法使用它,然后回退到默认语言),即使该命令locale -a
显示法语包。我有一些建议你可以试试。
首先,列出所有支持的语言环境:
cat /usr/share/i18n/SUPPORTED
现在,生成您需要的语言:
sudo locale-gen fr_FR.UTF-8
sudo locale-gen fr_FR.ISO-8859-1
sudo dpkg-reconfigure locales
如果它不起作用,请尝试安装包language-pack-fr和language-support-fr并再次生成语言。
这个问题很奇怪。我有一个带有 Ubuntu 11.04 和 PHP 5.3.8 的虚拟机,它在我的 Debian 6 中也能正常工作,而且我没有安装任何软件包或配置任何东西。