如何对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

回到顶部