in reply to Re^3: Encoding problem with function in C library
in thread Encoding problem with function in C library

In my tests, the output code page persisted after the program run

Interesting, in my test on Win 10 Pro with Win32::SetConsoleOutputCP(65001), the codepage change didn't persist.

Update: Sorry, nevermind, see my reply below!

Replies are listed 'Best First'.
Re^5: Encoding problem with function in C library
by Corion (Patriarch) on Dec 22, 2022 at 13:43 UTC

    That's really interesting, since it certainly persists for me. I expected the whole console window to change output based on the strings, but I get the following output:

    tmp.pl

    #!perl use strict; use warnings; use charnames ':full'; use Win32::Console; binmode STDOUT, ':encoding(UTF-8)'; print "\N{INFINITY}\n";

    tmp2.pl

    #!perl use strict; use warnings; use charnames ':full'; use Win32; Win32::SetConsoleOutputCP(65001); binmode STDOUT, ':encoding(UTF-8)'; print "\N{INFINITY}\n";

    And the console output:

    C:>perl q:\tmp.pl
    дъз
    
    C:>perl q:\tmp2.pl
    ∞
    
    C:>perl q:\tmp.pl
    ∞
    
    C:>chcp
    Aktive Codepage: 850.
    

    I'd expect the code page not to persist, and the output of CHCP does indicate that, but the terminal output / interpretation of the programs does indicate that after the first change to UTF-8, the output of subsequent programs is also interpreted as UTF-8 ...

      Ah, I think I see what's going on, chcp apparently sets both the input (SetConsoleCP) and output (SetConsoleOutputCP) code pages, but when used to report the current code page, it apparently reports only the input code page, which is why I thought the changes don't persist.

      C:\Temp>type test.pl #!perl use warnings; use strict; use open qw/:std :encoding(UTF-8)/; use Win32; print "GetConsoleCP: ", Win32::GetConsoleCP(), "\n"; print "GetConsoleOutputCP: ", Win32::GetConsoleOutputCP(), "\n"; print "chcp: "; system("chcp"); Win32::SetConsoleOutputCP(65001); Win32::SetConsoleCP(65001) if @ARGV; C:\Temp>perl test.pl GetConsoleCP: 850 GetConsoleOutputCP: 850 chcp: Active Codepage: 850. C:\Temp>perl test.pl x GetConsoleCP: 850 GetConsoleOutputCP: 65001 chcp: Active Codepage: 850. C:\Temp>perl test.pl x GetConsoleCP: 65001 GetConsoleOutputCP: 65001 chcp: Active Codepage: 65001. C:\Temp>chcp 850 Active Codepage: 850. C:\Temp>perl test.pl GetConsoleCP: 850 GetConsoleOutputCP: 850 chcp: Active Codepage: 850.