Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

Case-insensitive substr_compare, ksort, krsort are still locale-dependent

Ouverte Adaptée aux débutants
#24,552 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@lazerg y travaille déjà.

Depuis le 22/10/2026.

  • #24558 par @lazerg — ouverte
  • #24559 par @sirreal — ouverte

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
73/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
c, php
Domaine
backend, testing

Piste de recherche

Commence par l’appel de substr_compare() à zend_binary_strncasecmp_l() et par le comparateur de clés de tableau insensible à la casse php_array_key_compare_string_case_unstable_i() dans php-src ; l’issue identifie les deux points d’entrée et les fonctions de comparaison de remplacement. Vérifie les tests existants de substr_compare(), ksort() et krsort() avec SORT_STRING | SORT_FLAG_CASE, puis ajoute des tests de régression pour la locale turque. Le travail est terminé lorsque ces cas correspondent au comportement ASCII insensible à la casse décrit et que les tests existants réussissent.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Bug Status: Needs Triage
Description

The following code:

<?php
foreach (['C', 'tr_TR.UTF-8'] as $locale) {
    if (setlocale(LC_CTYPE, $locale) === false) {
        throw new RuntimeException("Locale unavailable: $locale");
    }

    $values = ['I', 'h'];
    sort($values, SORT_STRING | SORT_FLAG_CASE);
    $keys = ['I' => 0, 'h' => 0];
    ksort($keys, SORT_STRING | SORT_FLAG_CASE);

    echo $locale, "\n";
    echo '  stripos:        ', var_export(stripos('I', 'i'), true), "\n";
    echo '  strncasecmp:    ', strncasecmp('I', 'i', 1), "\n";
    echo '  substr_compare: ', substr_compare('I', 'i', 0, 1, true), "\n";
    echo '  sort:           ', implode(',', $values), "\n";
    echo '  ksort:          ', implode(',', array_keys($keys)), "\n";
}

Resulted in this output:

C
  stripos:        0
  strncasecmp:    0
  substr_compare: 0
  sort:           h,I
  ksort:          h,I
tr_TR.UTF-8
  stripos:        0
  strncasecmp:    0
  substr_compare: -32
  sort:           h,I
  ksort:          I,h

But I expected this output instead:

C
  stripos:        0
  strncasecmp:    0
  substr_compare: 0
  sort:           h,I
  ksort:          h,I
tr_TR.UTF-8
  stripos:        0
  strncasecmp:    0
  substr_compare: 0
  sort:           h,I
  ksort:          h,I

Reproduction link


PHP 8.2 switched strtolower(), stripos(), sort() with SORT_STRING | SORT_FLAG_CASE # and related functions to ASCII case conversion, but substr_compare() with $case_insensitive = true and ksort()/krsort() with SORT_STRING | SORT_FLAG_CASE still follow LC_CTYPE.

The output above is from PHP 8.2.35, 8.3.36, 8.4.27 and 8.5.12. PHP 8.1.34 prints the same, except that stripos() and sort() also follow the locale (false and I,h). 8.2 changed those two but not substr_compare() or ksort().

Reproducing on PHP 8.1 to 8.5 with Docker

The official php:*-cli images have no tr_TR.UTF-8 locale, so each run generates it first. With the snippet above saved as repro.php:

for v in 8.1 8.2 8.3 8.4 8.5; do
  docker run --rm -i "php:$v-cli" sh -c '
    apt-get update -qq >/dev/null &&
    apt-get install -y -qq locales >/dev/null 2>&1 &&
    localedef -i tr_TR -f UTF-8 tr_TR.UTF-8 &&
    php -v | head -n 1 &&
    php' < repro.php
done

The 8.2 UPGRADING notes say sorting with SORT_FLAG_CASE uses ASCII case conversion, and the strtolower-ascii RFC says case-insensitive substr_compare() already did.

On master, substr_compare() calls zend_binary_strncasecmp_l(), and php_array_key_compare_string_case_unstable_i(), which ksort() and krsort() use, calls zend_binary_strcasecmp_l().

Switching these two call sites to zend_binary_strncasecmp() and zend_binary_strcasecmp() would give the documented behavior.

See https://github.com/php/php-src/pull/7506.

PHP Version
PHP 8.5.12 (cli) (built: Oct 21 2026 15:53:40) (NTS)
Copyright (c) The PHP Group
Built by https://github.com/docker-library/php
Zend Engine v4.5.12, Copyright (c) Zend Technologies
    with Zend OPcache v8.5.12, Copyright (c), by Zend Technologies
Operating System

Debian GNU/Linux 13 (trixie), glibc 2.41 (php:8.5-cli Docker image)

Langage dominant
C
Étoiles
40.7k
Forks
8.3k
Merge moyen
17 h 29 min
PR mergées (30 j)
10

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de php/php-src

Toutes les issues de php/php-src

Issues similaires

Plus d'issues C

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.