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.

Reply via email to