PHP : lettres accentuées en majuscule

Rien de nouveau sous le soleil mais cela me perturbe toujours autant : pourquoi ne peut-on toujours pas se fier aux fonctions communes de manipulations ou de test des chaînes de caractères dés que des lettres accentuées sont en jeu ?

Le cas qui m'a occupé ces temps-ci est la mise en majuscule du E accent aigu (« é »). Je n'arrivais pas à obtenir de résultats pertinents avec une fonction comme stripos dés que la chaîne scrutée contenait une lettre accentuée en majuscule. La fonction est incapable de retrouver la lettre correspondante en minuscule, comme l'illustre le test suivant.

class UpperLowerTest extends PHPUnit_Framework_TestCase
{
    public static $lower = 'é';
    public static $upper = 'É';
    
    public function testStrToUpper()
    {
        $this->assertEquals(self::$upper, strtoupper(self::$lower), 'strtoupper');
        // => ko
    }
    
    public function testStrToLower()
    {
        $this->assertEquals(self::$lower, strtolower(self::$upper), 'strtolower');
        // => ko
    }
    
    public function testMbStrToUpper()
    {
        $this->assertEquals(self::$upper, mb_strtoupper(self::$lower), 'mb_strtoupper');
        // => ok
    }
    
    public function testMbStrToLower()
    {
        $this->assertEquals(self::$lower, mb_strtolower(self::$upper), 'mb_strtolower');
        // => ok
    }
}
Tests unitaire pour comparer les fonctions « classique » de changement de casse à leurs équivalents « multi-octets ».

Il faut donc toujours passer par les « fonction multi-octets », mb_stripos en l'occurrence. Ca va bien finir par rentrer cette histoire.

Titre
Multibyte String Functions
Auteurs
Mehdi ACHOUR
Auteurs
Friedhelm BETZ
Auteurs
Antony DOVGAL
Auteurs
Nuno LOPES
Auteurs
Hannes MAGNUSSON
Auteurs
Georg RICHTER
Auteurs
Damien SEGUY
Auteurs
Jakub VRANA
Editeur
PHP.net
Date