#47481 [Opn->Csd]: strnatcmp: char instead of unsigned char
| From: | jani@php.net | Date: | Thu, 16 Jul 2009 16:21:33 +0000 |
| Subject: | #47481 [Opn->Csd]: strnatcmp: char instead of unsigned char | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-139826@lists.php.net to get a copy of this message | ||
ID: 47481
Updated by: jani@php.net
Reported By: carsten_sttgt at gmx dot de
-Status: Open
+Status: Closed
Bug Type: Strings related
Operating System: *
PHP Version: 5.2.8
New Comment:
This bug has been fixed in CVS.
Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
Thank you for the report, and for helping us make PHP better.
Previous Comments:
------------------------------------------------------------------------
[2009-03-31 03:25:29] hradtke@php.net
Hi Carsten,
I have no idea why I thought zend_parse_paramters was a problem.
I see no reason why strnatcmp_ex() couldn't use unsigned char's rather
than a normal char. I suspect the type casting is done to make sure the
character is properly promoted for the is*() calls.
Test case - http://www.hermanradtke.com/patches/bug47481.phpt
Patch -
http://www.hermanradtke.com/patches/php-47481-natcasesort-extended-ascii.patch
------------------------------------------------------------------------
[2009-03-10 11:13:38] carsten_sttgt at gmx dot de
> The strnatcmp uses the zend_parse_paramters function to parse
> the function parameters.
Ah, ok, I_m not familiar with the PHP/Zend internals (or C...).
Just a question about the difference between natsort() and asort().
Should they not work in the same way if you have an array without
numbers in the key values? And if I look into array.c,
PHP_FUNCTION(asort) is also using zend_parse_parameters.
e.g. IMHO this script should result in 2 times the same output:
<?php
$datensort = $datennat = $daten = array(
'Süden','spielen','Sonne','Wind','Regen','Meer'
);
natsort($datennat);
print_r($datennat);
asort($datensort);
print_r($datensort);
?>
Regards,
Carsten
------------------------------------------------------------------------
[2009-03-03 05:06:31] hradtke@php.net
The strnatcmp uses the zend_parse_paramters function to parse the
function parameters. The zend_parse_parameters function converts the
string from php space into a char. Seeing as how this is a core
function, I doubt this will be fixed soon.
I may be completely off base, so I will leave this bug open in case
someone else wants to comment.
------------------------------------------------------------------------
[2009-02-23 13:40:21] carsten_sttgt at gmx dot de
Description:
------------
Hello,
why is the nat_char defined as char instead of unsigned char?
char limit us (and a correct sorting) to ASCII 0-127. With a unsigned
char (ASCII 0-255) the sorting is "correct" for all single byte charsets
like iso-8850-1 (which is the default in PHP).
Internally the function is already doing a cast to unsigned char many
times (but not in the main comparison).
In the original header (strnatcmp.h) from the author, the typedef for
nat_char is also only a hint.
Regards,
Carsten
Reproduce code:
---------------
<?php
$daten =
array('Süden','spielen','Sonne','Wind','Regen','Meer');
natcasesort($daten);
print_r($daten);
?>
Expected result:
----------------
Array
(
[5] => Meer
[4] => Regen
[2] => Sonne
[1] => spielen
[0] => Süden
[3] => Wind
)
Actual result:
--------------
Array
(
[5] => Meer
[4] => Regen
[0] => Süden
[2] => Sonne
[1] => spielen
[3] => Wind
)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=47481&edit=1