Over time - as the importance of multibyte encoding support grew - a variety
of extensions appeared. While each achieves its goal somewhat differently
and might be preferred over the other, they still all do that one thing.
What can a framework provide, those extensions aren't? It can provide
abstractions that allow portable code. While this might not be a requirement
for application code, it's a definite must for the framework's core code.
As previously mentioned extensions appeared in a semi-evolutionary way. This
leaves us with the situation where extensions are heterogeneously spread out
over environments. There certainly is no clear winner and we're left with
the situation of "supporting them all".
Technically this class does very little in terms of abstraction. Its main
purpose is to allow adapting to changing environments: virtually creating
something you can rely on, something that's always there while it actually
is there only in one way or the other. And - yes - some convenience methods
are also on board.