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.

ACHOUR, Mehdi ; BETZ, Friedhelm ; DOVGAL, Antony, et al.. Multibyte String Functions. PHP.net,