Mercurial treats everything as bytes. Whatever you store in your repo, that's what Mercurial reads -- bytes. There are no encodings, there are no strings. Only bytes. You don't want your VCS to start having opinions about which language you should speak and how you should encode it.
PEP 461 was the bare minimum we needed before porting to Python 3 could happen:
http://legacy.python.org/dev/peps/pep-0461/
We needed a way to put things into bytestrings.
And after that, it's just nothing but work. Lots of it. Little of which could be automated.
I get a little impatient, personally, with people who think that upgrading software is easy. We don't actually care about Python. We care about version control. Python is just some thing in the middle that is helping us produce version control. A multi-year effort to upgrade to Python 3 (or 3.8 or whatever) isn't giving us or our users a net benefit. In fact, until recently, it was a net loss, because Python 3.5 or 3.6 had slower warmup time, which is terrible for a tool like hg that needs to pay that cost every time you run any command.
Instead, Python 3 created busy work. Almost five years of it.