Implementing JEP 400 on Windows 10 and Windows 11

John Platts john_platts at hotmail.com
Tue Oct 5 01:22:12 UTC 2021


I wrote a test program (in C++) to detect the codepages that would be returned by the GetACP(), GetOEMCP(), and GetConsoleCP() functions when the <utf8:activeCodePage>UTF-8</utf8:activeCodePage> setting is added to the manifest.

The <utf8:activeCodePage> manifest element (supported on Windows 10 Version 1903 or later) is in the http://schemas.microsoft.com/SMI/2019/WindowsSettings namespace and is added to the asmv3:WindowsSettings element as shown below:
<asmv3:windowsSettings xmlns:dpi1="http://schemas.microsoft.com/SMI/2005/WindowsSettings"
                       xmlns:dpi2="http://schemas.microsoft.com/SMI/2016/WindowsSettings"
                       xmlns:utf8="http://schemas.microsoft.com/SMI/2019/WindowsSettings">
    <dpi1:dpiAware>true/PM</dpi1:dpiAware>
    <dpi2:dpiAwareness>PerMonitorV2, PerMonitor, system</dpi2:dpiAwareness>
    <utf8:activeCodePage>UTF-8</utf8:activeCodePage>
</asmv3:windowsSettings>

Here is the output of the test program without the <utf8:activeCodePage>UTF-8</utf8:activeCodePage> setting present in the executable manifest:
GetACP() result:       1252
GetOEMCP() result:     437
GetConsoleCP() result: 437
System default LCID:   1033
User default LCID:     1033
User default UI LCID:  1033
Codepage from system default LCID:  1252
Codepage from user default LCID:    1252
Codepage from user default UI LCID: 1252

Here is the output of the same test program with an executable manifest that includes the <utf8:activeCodePage>UTF-8</utf8:activeCodePage> setting:
GetACP() result:       65001
GetOEMCP() result:     65001
GetConsoleCP() result: 437
System default LCID:   1033
User default LCID:     1033
User default UI LCID:  1033
Codepage from system default LCID:  1252
Codepage from user default LCID:    1252
Codepage from user default UI LCID: 1252

Note that the <utf8:activeCodePage>UTF-8</utf8:activeCodePage> setting in the application manifest changes the results of the GetACP() and GetOEMCP() calls but not the GetConsoleCP() call.

I wrote another test program, and the argument strings passed into the main(int argc, char** argv) function are converted to UTF-8 if the <utf8:activeCodePage>UTF-8</utf8:activeCodePage> setting is there in the application manifest whereas the argument strings passed into the main (int argc, char** argv) function are converted to the ANSI codepage (which is usually code page 1252 on US English systems) if the <utf8:activeCodePage>UTF-8</utf8:activeCodePage> setting is there in the UTF-8 manifest.


More information about the core-libs-dev mailing list