我currentyl没有线索如何排序在PHP中包含UTF-8编码字符串的数组。该数组来自LDAP服务器,因此通过数据库进行排序(没有问题)是没有解决方案的。 下面我的Windows开发机器上不工作(虽然我认为这应该是至少一个可能的解决方案):如何对UTF-8字符串数组进行排序?
$array=array('Birnen', 'Äpfel', 'Ungetüme', 'Apfel', 'Ungetiere', 'Österreich');
$oldLocal=setlocale(LC_COLLATE, "0");
var_dump(setlocale(LC_COLLATE, 'German_Germany.65001'));
usort($array, 'strcoll');
var_dump(setlocale(LC_COLLATE, $oldLocal));
var_dump($array);
输出是:
string(20) "German_Germany.65001"
string(1) "C"
array(6) {
[0]=>
string(6) "Birnen"
[1]=>
string(9) "Ungetiere"
[2]=>
string(6) "Äpfel"
[3]=>
string(5) "Apfel"
[4]=>
string(9) "Ungetüme"
[5]=>
string(11) "Österreich"
}
这完全是胡说八道。使用1252作为setlocale()
的代码页给出了另一个输出但仍然是一个完全错误之一:
string(19) "German_Germany.1252"
string(1) "C"
array(6) {
[0]=>
string(11) "Österreich"
[1]=>
string(6) "Äpfel"
[2]=>
string(5) "Apfel"
[3]=>
string(6) "Birnen"
[4]=>
string(9) "Ungetüme"
[5]=>
string(9) "Ungetiere"
}
有没有一种方法排序与UTF-8字符串数组语言环境感知?
刚才注意到,这似乎是Windows上的PHP问题,因为在Linux机器上用作区域设置的的片段相同。然而这个Windows的具体问题的解决方案将是不错...
它在这里工作得很好(请参阅下面的文章),你确定它与机器的配置无关吗? – Huppie 2008-09-23 11:26:19
请注意,排序顺序取决于语言。在德语中,A和Ä有时可以被分类,就好像它们是同一个字母一样,有时候Ä可以被分类,因为它实际上是“AE”。但是瑞典语是Ä出现在字母表的末尾。 Carl – 2008-09-24 08:16:04
您是对的 - 通过使用正确的语言环境和strcoll()进行排序,此属性得到了尊重。这里的问题是,在Windows上,strcoll()在输入字符串是UTF-8编码时似乎有问题。 – 2008-09-24 08:57:12