如何对UTF-8字符串数组进行排序?
我currentyl不知道如何对包含PHP中UTF-8编码字符串的数组进行排序。该数组来自LDAP服务器,因此通过数据库排序(不会有问题)不是解决方案。以下内容不适用于我的Windows开发计算机(尽管我认为这至少应该是一个可能的解决方案):
$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问题,因为与de_DE.utf8
语言环境相同的代码段在Linux机器上也可以使用。不过,针对此Windows特定问题的解决方案将是不错的…
回答:
最终,由于Huppie发现了明显的PHP错误,因此如果不使用ΤζΩΤΙΙΙΟΥ所建议的不使用重新编码的字符串(UTF-8→Windows-1252或ISO-8859-1),就无法以简单的方式解决此问题。总结问题,我创建了以下代码段,清楚地说明了问题是使用65001
Windows-UTF-8代码页时的strcoll()函数。
function traceStrColl($a, $b) { $outValue=strcoll($a, $b);
echo "$a $b $outValue\r\n";
return $outValue;
}
$locale=(defined('PHP_OS') && stristr(PHP_OS, 'win')) ? 'German_Germany.65001' : 'de_DE.utf8';
$string="ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜabcdefghijklmnopqrstuvwxyzäöüß";
$array=array();
for ($i=0; $i<mb_strlen($string, 'UTF-8'); $i++) {
$array[]=mb_substr($string, $i, 1, 'UTF-8');
}
$oldLocale=setlocale(LC_COLLATE, "0");
var_dump(setlocale(LC_COLLATE, $locale));
usort($array, 'traceStrColl');
setlocale(LC_COLLATE, $oldLocale);
var_dump($array);
结果是:
string(20) "German_Germany.65001"a B 2147483647
[...]
array(59) {
[0]=>
string(1) "c"
[1]=>
string(1) "B"
[2]=>
string(1) "s"
[3]=>
string(1) "C"
[4]=>
string(1) "k"
[5]=>
string(1) "D"
[6]=>
string(2) "ä"
[7]=>
string(1) "E"
[8]=>
string(1) "g"
[...]
相同代码段可在Linux机器上运行,而不会产生以下输出问题:
string(10) "de_DE.utf8"a B -1
[...]
array(59) {
[0]=>
string(1) "a"
[1]=>
string(1) "A"
[2]=>
string(2) "ä"
[3]=>
string(2) "Ä"
[4]=>
string(1) "b"
[5]=>
string(1) "B"
[6]=>
string(1) "c"
[7]=>
string(1) "C"
[...]
当使用Windows-1252(ISO-8859-1)编码的字符串(当然mb_ *编码和语言环境必须更改)时,该代码段也可以使用。
我在bugs.php.net上提交了错误报告:错误#46165
strcoll()在Windows上不适用于UTF-8字符串。如果您遇到相同的问题,则可以在错误报告页面上向PHP团队提供反馈(另外两个可能相关的错误被归类为
伪造 -我认为此错误不是 伪造的 ;-)。
感谢大家。
以上是 如何对UTF-8字符串数组进行排序? 的全部内容, 来源链接: utcz.com/qa/405795.html