我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