You missread me. You are comparing upper case and lower case. I said "original case" to result case.

For example: 0x01e9e  uppercase is 0x000df.
But 0x000df's lower case *isn't* 0x01e9e. It's 0x000de.

Try this main (with your new uni, I wrote the equivalent with extracting the data from file):
```D
import std.uni;
import std.utf;
import std.typetuple;

void main()
{
    foreach(Type; TypeTuple!(char, wchar))
    {
        foreach( dchar ch; 0..0x10FFFF)
        {
            dchar upper = toUpper(ch);
            dchar lower = toLower(ch);

            int len  = codeLength!Type(ch);
            int uLen = codeLength!Type(upper);
            int lLen = codeLength!Type(lower);
            assert(len >= uLen);
            assert(len >= lLen);
        }
    }
} 
```

As you can see, the encoding of any character's upper or lower is either the same, or smaller.