> In both UTF-8 and UTF-16 encodings, code points may take up to 4 bytes.<p>Wrong: up to 4 bytes UTF16, and up to 6 bytes UTF8.<p>> Cyrillic, Hebrew and several other popular Unicode blocks are 2 bytes both in UTF-16 and UTF-8.<p>Cyrillic, Hebrew and several other languages still have spaces and punctuation, that take a single byte in UTF8. Now it’s 2016, RAM and storage are cheap and declining, but CPU branch misprediction cost is same 20 cycles and not going to decline.<p>> plain Windows edit control (until Vista)<p>Windows XP is 14 years old, and now in 2016 it’s market share is less then 3%. Who cares what was before Vista?<p>> In C++, there is no way to return Unicode from std::exception::what() other than using UTF-8.<p>The exception that are part of STL don’t return Unicode at all, they are in English.<p>If you throw your custom exceptions, return non-English messages in exception::what() in utf-8, catch std::exception and call what() — you’ll get English error messages for STL-thrown exceptions, and non-English error messages for your custom exceptions.<p>I’m not sure mixing GUI languages in a single app is always a right thing.<p>> First, the application must be compiled as Unicode-aware<p>The oldest visual studio I have installed is 2008 (because I sometimes develop for WinCE). I’ve just created a new C++ console application project, and by default it already Unicode-aware.<p>So, for anyone using Microsoft IDE, this requirement is not a problem.