最终,由于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 $outValuern"; 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团队提供反馈(另外两个可能相关的错误被归类为
伪造 -我认为此错误不是 伪造的 ;-)。
感谢大家。



