On 2021-10-05 03:22, John Platts wrote:
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.
This is really confusing. I'm glad you are gathering empirical evidence of how it works. :-)

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.

I'm not sure I understand this. What is the difference between "the application manifest" and "the UTF-8 manifest"?

/Magnus

Reply via email to