Localisation / russification garantie de la console Windows

introduction

Les applications de console sont toujours le type d'application le plus populaire, la plupart des développeurs affinent leur architecture et leur logique métier dans la console. Dans le même temps, ils sont souvent confrontés au problème de la localisation - le texte russe, qui est reflété de manière assez adéquate dans le fichier source, lorsqu'il est affiché sur la console, prend la forme de ce que l'on appelle. "krakozyabr".





En général, la localisation de la console Windows avec le module linguistique approprié n'est pas difficile. Néanmoins, une solution complète et sans ambiguïté à ce problème, en substance, n’a pas encore été trouvée. La raison en est principalement la nature même de la console, qui, étant un composant système implémenté par la classe statique System.Console, expose ses méthodes à l'application via des programmes shell système tels que la ligne de commande ou le processeur de commandes (cmd. exe), PowerShell, Terminal et autres.

En fait, la console est sous double contrôle - applications et shells, ce qui est une situation potentiellement conflictuelle, principalement en termes d'utilisation des encodages.





Ce matériel n'offre pas un algorithme strict d'actions, mais vise à décrire les problèmes clés que le développeur d'une application console localisée rencontre inévitablement, ainsi que quelques moyens possibles de les résoudre. On suppose que cela permettra au développeur de former une stratégie pour travailler avec une console localisée et de mettre en œuvre efficacement les capacités techniques existantes, dont la plupart sont bien décrites et sont omises ici.





Types de consoles

En général, les fonctions de la console sont les suivantes:





  • gestion du système d'exploitation et de l'environnement système des applications basée sur l'utilisation de dispositifs d'entrée-sortie système standard (écran et clavier), à l'aide des commandes du système d'exploitation et / ou de la console elle-même;





  • - , -.





Windows - (CMD). PowerShell (PS), Windows PowerShell (WPS) Terminal. Windows Windows Power Shell 5, - 7-, (, 6-) - . Terminal - , PowerShell .





Visual Studio (CMD-D).





, Windows, " " . , - DOS (CP437, CP866) Windows Unicode.





: / (habr.com)





Windows CP1251 (Windows-1251, ANSI, Windows-Cyr), 8- CP65001 (UTF-8, Unicode Transformation Format), , . , , Windows DOS - CP437 (DOSLatinUS, OEM) CP866 (AltDOS, OEM).





1. ( , .) UTF-8. , .





2. , Notepad++. Visual Studio , VS.





, " ", 1 2, :





- CMD, PS WPS. CHCP, Echo c (. 1), , UTF-8 (CP65001): , , , .





:





  • > Echo ffffff //





  • PS> Echo ffffff // PowerShell





  • PS> Echo ffffff ?????? // Windows PowerShell





:





using System;
using ova.common.logging.LogConsole;
using Microsoft.Extensions.Logging;
using ova.common.logging.LogConsole.Colors;

namespace LoggingConsole.Test
{
    partial class Program
    {
        static void Main2(string[] args)
        {
            ColorLevels.ColorsDictionaryCreate();
            Console.WriteLine("Hello World! , !");     //     
            LogConsole.Write("   ", LogLevel.Information);
            Console.WriteLine($"8. Active codepage: input {Console.InputEncoding.CodePage}, output {Console.OutputEncoding.CodePage}");
            Console.ReadKey();
        } 
    }
}
      
      



, : WPS .





Languette.  1. Le résultat de la commande de console Echo ffffff ffffff
. 1. Echo ffffff

50% , .2.





Languette.  2. Résultat de l'exécution de l'application LoggingConsole.Test
. 2. LoggingConsole.Test

o 3. PowerShell . , ...





Windows DOS. CP437, CP866. cmd.exe 866, 437, .





4. CHCP - 866, 1251, 65001.





5. . : \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor Autorun : chcp < >. : Windows UTF-8 (qastack.ru), : Change default code page of Windows console to UTF-8.





Visual Studio

Visual Studio , Windows PowerShell . , , . - Windows, , , .





Visual Studio , Visual Studio , , , . , Windows , CHCP, . , , , 437 866.





6. , .





- ? - ".exe" , . , , , - - ,





Visual Studio

- , , , .





, - . Microsoft : "Programs that you start after you assign a new code page use the new code page. However, programs (except Cmd.exe) that you started before assigning the new code page will continue to use the original code page". , , , . - ?





! - , - -.





, . Write , , , , , . , .





F:\LoggingConsole.Test\bin\Release\net5.0>chcp
Active code page: 1251

F:\LoggingConsole.Test\bin\Release\net5.0>loggingconsole.test
Codepages: current 1251:1251, setted 437:437, ΓΓεΣΦ∞ 5 ±Φ∞ΓεδεΓ ∩ε-≡≤±±ΩΦ: Θ÷≤Ωσ=Θ÷≤Ωσ
Codepages: current 437:437, setted 65001:65001,  5  -: =
Codepages: current 65001:65001, setted 1252:1252, ââîäèì 5 ñèìâîëîâ ïî-ðóññêè: éöóêå=éöóêå
Codepages: current 1252:1252, setted 1251:1251,  5  -: =
Codepages: current 1251:1251, setted 866:866,  5  -є: Ўє=Ўє
Codepages: current 866:866, setted 1251:1251,  5  -: =
Codepages: current 1251:1251, setted 1252:1252, ââîäèì 5 ñèìâîëîâ ïî-ðóññêè: éöóêå=éöóêå

F:\LoggingConsole.Test\bin\Release\net5.0>chcp
Active code page: 1252
      
      



  • 1251 ( 2);





  • (current, setted);





  • 1252 ( 11, setted);





  • ( 14 - Active codepage 1252);





  • (setted 1251:1251) ( 8 10).





using System;
using System.Runtime.InteropServices;

namespace LoggingConsole.Test
{
    partial class Program
    {
        [DllImport("kernel32.dll")] static extern uint GetConsoleCP();
        [DllImport("kernel32.dll")] static extern bool SetConsoleCP(uint pagenum);
        [DllImport("kernel32.dll")] static extern uint GetConsoleOutputCP();
        [DllImport("kernel32.dll")] static extern bool SetConsoleOutputCP(uint pagenum);
        
        static void Main(string[] args)
        {
            Write(437);
            Write(65001);
            Write(1252);
            Write(1251);
            Write(866);
            Write(1251);
            Write(1252);
         }

        static internal void Write(uint WantedIn, uint WantedOut)
        {
            uint CurrentIn = GetConsoleCP();
            uint CurrentOut = GetConsoleOutputCP();
            Console.Write($"current {CurrentIn}:{CurrentOut} -  , "); /*wanted {WantedIn}:{WantedOut},*/
            SetConsoleCP(WantedIn);
            SetConsoleOutputCP(WantedOut);
            Console.Write($"setted {GetConsoleCP()}:{GetConsoleOutputCP()} -  , ");
            Console.Write($" 3  -: ");
            string str = "" + Console.ReadKey().KeyChar.ToString();
            str += Console.ReadKey().KeyChar.ToString();
            str += Console.ReadKey().KeyChar.ToString();
            Console.WriteLine($"={str}");
        }
      
        static internal void Write(uint ChangeTo)
        {
            Write(ChangeTo, ChangeTo);
        }
    }
}

      
      



- . .Net , WinAPI: SetConsoleCP(uint numcp) SetConsoleOutputCP(uint numcp), numcp - . : Console Functions - Windows Console | Microsoft Docs. WInAPI .





7. ! SetConsoleCP - .





  1. PowerShell ( ), Windows PowerShell;





  2. Définissez la page de codes de console par défaut sur CP65001 (utf-8 Unicode) ou CP1251 (Windows-1251-Cyr), voir astuce 5 ;





  3. Développer des applications en encodage Unicode utf-8;





  4. Contrôlez l'encodage des fichiers de code source, des fichiers de données texte, par exemple, à l'aide de Notepad ++;





  5. Implémentez la gestion programmatique de la localisation des applications dans la console, exemple ci-dessous sous la coupe:





Un exemple de définition par programme de la page de codes et de localisation de l'application dans la console
using System;
using System.Runtime.InteropServices;

namespace LoggingConsole.Test
{
    partial class Program
    {
      	static void Main(string[] args)
        {
          	[DllImport("kernel32.dll")] static extern bool SetConsoleCP(uint pagenum);
        		[DllImport("kernel32.dll")] static extern bool SetConsoleOutputCP(uint pagenum);
            SetConsoleCP(65001);        //   utf-8 (Unicode)   
            SetConsoleOutputCP(65001);  //   utf-8 (Unicode)   
 
            Console.WriteLine($"Hello, World!");
        }
    }
}

      
      






All Articles