[Interest] Using UTF-8 code page with Qt5 on Windows?

Thiago Macieira thiago.macieira at intel.com
Thu May 19 06:58:22 CEST 2022

On Wednesday, 18 May 2022 20:31:55 PDT Alvin Wong wrote:
> Thanks for pointing me to the test. I compiled the test and created an
> application manifest for it to use UTF-8. It correctly detected the
> system codec to be UTF-8 and reported several failures and a bunch of
> warnings. I've attached the test output.

Thanks. It looks like you were completely right in your inspection of the 
code. All of the charByChar test rows that used more than 2 characters failed.

The "nul" entry also did, but that looks like a shortcoming of the Win32 API.

> This gave me an idea: perhaps the easiest way for Qt to fix it would
> be to check `GetACP() == CP_UTF8`, and if it is true then just use
> Qt's built-in UTF-8 support and bypass MultiByteToWideChar completely.

Indeed. And given that the UTF-8 codec is highly optimised, it will be 
definitely much faster. I'll make the change for Qt 6.

However, it wouldn't solve the problem for other multibyte locales that may 
have more than one continuation character. A quick check of the likely 
culprits reveals that:
 * Chinese (CP 936) uses GBK, which is limited to two bytes
 * Japanese (CP 932) uses a variant of Shift JIS, but is also two-byte only
 * Korean (CP 949) uses the Unified Hangul Code, which likewise only goes up 
   to two bytes

Wikipedia also says that GB 2312 is the most common encoding for web pages in 
Chinese, but that is also a one- or two-byte codec too. And it is no longer 
used by Windows itself.

So it looks like we've never hit this problem because the codepages used by 
Windows were all DBCS. It might not be worth fixing the codec implementation 

> > As far as I know, it already does. The Vietnamese locale for Windows has
> > been using UTF-8 for years (probably since forever) and there's no reason
> > that Qt shouldn't support it.
> I don't have first-hand experience with Vietnamese Windows but isn't
> Windows-1258 the Vietnamese code page? I know vaguely that
> Unicode-only locales (not Vietnamese) are a thing on Windows, but I
> thought they had no way to use UTF-8 as the ACP until the beta UTF-8
> support landed on Windows 10.

Ok, I'm probably remembering wrong. I thought it had been possible all along, 
but you had to switch to a particular language (which I thought was 
Vietnamese), which most users were not win a position to do.

The Wikipedia article on CP 1258 has the sentence "UTF-8 is the preferred 
encoding for Vietnamese in modern applications." I guess I was misled by it 
and thought it meant UTF-8 was in use on Windows.

Thiago Macieira - thiago.macieira (AT) intel.com
  Cloud Software Architect - Intel DCAI Cloud Engineering

More information about the Interest mailing list