Почему отличается System.-Encoding и Default-Encoding (. NET Core)? - PullRequest
2 голосов
/ 16 июня 2020

У меня есть приложение C#. NET Core. Я запускаю

System.Console.WriteLine(System.Text.Encoding.Default.WebName);

и получаю utf-8

Однако, если я открываю PowerShell и выдаю

[System.Text.Encoding]::Default

, я получаю

IsSingleByte      : True
BodyName          : iso-8859-1
EncodingName      : Westeuropäisch (Windows)
HeaderName        : Windows-1252
WebName           : Windows-1252
WindowsCodePage   : 1252
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : True
CodePage          : 1252

Почему системная кодировка отличается от кодировки по умолчанию? И как мне получить системное кодирование в этих условиях? Я имею в виду, я понял, что могу получить Windows -Codepage 1252 in. NET Core с

System.Text.Encoding.GetEncoding("iso-8859-1").WindowsCodePage

, но как мне определить кодовую страницу системы?

1 Ответ

0 голосов
/ 16 июня 2020

А, понял, что все еще работает, так это получение кодовой страницы по текущей культуре (или InstalledUICulture):

public static System.Text.Encoding GetSystemEncoding()
{
    // The OEM code page for use by legacy console applications
    // int oem = System.Globalization.CultureInfo.CurrentCulture.TextInfo.OEMCodePage;

    // The ANSI code page for use by legacy GUI applications
    // int ansi = System.Globalization.CultureInfo.InstalledUICulture.TextInfo.ANSICodePage; // Machine 
    int ansi = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage; // User 

    try
    {
        System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
        System.Text.Encoding enc = System.Text.Encoding.GetEncoding(ansi);
        return enc;
    }
    catch (System.Exception)
    { }


    try
    {

        foreach (System.Text.EncodingInfo ei in System.Text.Encoding.GetEncodings())
        {
            System.Text.Encoding e = ei.GetEncoding();

            // 20'127: US-ASCII 
            if (e.WindowsCodePage == ansi && e.CodePage != 20127)
            {
                return e;
            }

        }
    }
    catch (System.Exception)
    { }

    // return System.Text.Encoding.GetEncoding("iso-8859-1");
    return System.Text.Encoding.UTF8;
}
...