Console, Encoding i ogonki

0

Jakoś dalej sie ucze c#. Zainstalowałem sobie Visual Studio 2015 Cimmynity. I ćwiczę. W chwilach wolnych. Znalazłem tutorial dla początkujących na MSDN. Console Application, która czyta plik tekstowy i wyświetla go na konsoli, czyli Console.Write i Colsole.WriteLine. Dobry przykład, bo upewniłem się, że zrozumiałem yield return. Ale coś mnie podkusiło. W przykładzie wyświetlany teks jest po indiańsku. no a przecież kto ja jestem - Polak mały i wziąłem sobie tekst polski. I dostałem robaki zamiast ogonków. No i zacząłem wujka pytać, o co chodzi. I znalazłem, że trzeba zastosować Encoding.
Nawet konkretne przykłady znalazłem. Ale błędami mi sypało. Męczyłem wujka dalej i znalazłem taki przykład: https://msdn.microsoft.com/pl-pl/library/system.text.encoding.getencodings(v=vs.110).aspx. Zrobiłem sobie folder EncodingsList i w nim zawołałem cmd, a tam dotnet new. Zrobiła się dobrze znana aplikacja konsolowa "Hello word". Przeedytowałem plik Program.cs wstawiając do niego kod z wyżej wspomnianego przykładu, czyli:

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // Print the header.
      Console.Write( "CodePage identifier and name     " );
      Console.Write( "BrDisp   BrSave   " );
      Console.Write( "MNDisp   MNSave   " );
      Console.WriteLine( "1-Byte   ReadOnly " );

      // For every encoding, get the property values.
      foreach( EncodingInfo ei in Encoding.GetEncodings() )  {
         Encoding e = ei.GetEncoding();

         Console.Write( "{0,-6} {1,-25} ", ei.CodePage, ei.Name );
         Console.Write( "{0,-8} {1,-8} ", e.IsBrowserDisplay, e.IsBrowserSave );
         Console.Write( "{0,-8} {1,-8} ", e.IsMailNewsDisplay, e.IsMailNewsSave );
         Console.WriteLine( "{0,-8} {1,-8} ", e.IsSingleByte, e.IsReadOnly );
      }

   }

} 

a w oknie cmd napisałem dotnet restore a potem dotnet build. Z kupę błedów dostałem:

Microsoft Windows [Wersja 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Wszelkie prawa zastrzeżone.

c:\c_proj\EncodingsList>dotnet new
Created new C# project in c:\c_proj\EncodingsList.

c:\c_proj\EncodingsList>dotnet restore
log  : Restoring packages for c:\c_proj\EncodingsList\project.json...
log  : Writing lock file to disk. Path: c:\c_proj\EncodingsList\project.lock.json
log  : c:\c_proj\EncodingsList\project.json
log  : Restore completed in 8732ms.

c:\c_proj\EncodingsList>dotnet build
Project EncodingsList (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling EncodingsList for .NETCoreApp,Version=v1.0
C:\Program Files\dotnet\dotnet.exe compile-csc @c:\c_proj\EncodingsList\obj\Debug\netcoreapp1.0\dotnet-compile.rsp returned Exit Code 1
c:\c_proj\EncodingsList\Program.cs(15,44): error CS0117: 'Encoding' does not contain a definition for 'GetEncodings'
c:\c_proj\EncodingsList\Program.cs(15,16): error CS0246: The type or namespace name 'EncodingInfo' could not be found (are you missing a using directive or an a
ssembly reference?)
c:\c_proj\EncodingsList\Program.cs(19,45): error CS1061: 'Encoding' does not contain a definition for 'IsBrowserDisplay' and no extension method 'IsBrowserDispl
ay' accepting a first argument of type 'Encoding' could be found (are you missing a using directive or an assembly reference?)
c:\c_proj\EncodingsList\Program.cs(19,65): error CS1061: 'Encoding' does not contain a definition for 'IsBrowserSave' and no extension method 'IsBrowserSave' ac
cepting a first argument of type 'Encoding' could be found (are you missing a using directive or an assembly reference?)
c:\c_proj\EncodingsList\Program.cs(20,45): error CS1061: 'Encoding' does not contain a definition for 'IsMailNewsDisplay' and no extension method 'IsMailNewsDis
play' accepting a first argument of type 'Encoding' could be found (are you missing a using directive or an assembly reference?)
c:\c_proj\EncodingsList\Program.cs(20,66): error CS1061: 'Encoding' does not contain a definition for 'IsMailNewsSave' and no extension method 'IsMailNewsSave'
accepting a first argument of type 'Encoding' could be found (are you missing a using directive or an assembly reference?)
c:\c_proj\EncodingsList\Program.cs(21,65): error CS1061: 'Encoding' does not contain a definition for 'IsReadOnly' and no extension method 'IsReadOnly' acceptin
g a first argument of type 'Encoding' could be found (are you missing a using directive or an assembly reference?)

Compilation failed.
    0 Warning(s)
    7 Error(s)

Time elapsed 00:00:00.9333784


c:\c_proj\EncodingsList>

Co zrobiłem źle?

0

Próbujesz zastosować kod z .NET Framework w .NET Core. W .NET Core klasa Encoding nie ma metody GetEncodings(). A gdybyś wpadł na pomysł używania pewnych dodatkowych stron kodowych, to musisz sobie zarejestrować dodatkowy provider.

https://docs.microsoft.com/en-us/dotnet/core/api/system.text.encoding

0

Przepraszam, że długo nie odzywałem się. Dopiero wieczorem odstawiłem wnuka do domu. Już zapomniałem, jak taki mały dzieciak zajmuje cały czas.
Przeczytałem linki. Ja już wcześniej zauważyłem rożne dokumentacje dla tej samej dla mnie klasy Encoding. Nie wiem dlaczego Visual Studio 2015 "nie widzi" .NET Framework, a tylko "widzi" .NET Core. Tak jest nawet jak otworzę ten projekt pod IDE. Ale Jak uruchomię Visual Studio 2010 to nie mam błędów. Może potrzebuje coś przestawić czy doinstalować? Spróbuję coś z tą rejestracją providera. No ale boję się, że to jeszcze za wysokie schody.

0

Po prostu: jeżeli stworzyłeś projekt przez dotnet new to to jest automatycznie projekt .NET Core i zawsze będzie. VS 2015 pozwala na obsługę zarówno projektów Core, jak i "zwykłego" Frameworka - jako "Console Application" w kategorii "Windows -> Classic Desktop".

Rejestracja providera jest potrzebna tylko, jeżeli chcesz wykorzystać jakieś bardziej wymyślne kodowanie, np. Windows-1252 zamiast tych ludzkich w rodzaju UTF-8; nie spowoduje dodania metody GetEncodings().

0

Bardzo dziękuję za odpowiedź. Dużo mi się wyjaśniło. Rzeczywiście kod, który wcześniej podałem, z .NET Framework działa. Działa także to poniższe:

using System;
using System.Text;

namespace ConsoleApp1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(Encoding.GetEncoding("windows-1250").EncodingName);
        }
    }
}

i windows-1250 to Środkowoeuropejski (Windows). Ale z .NET Core ... . No cóż - kompiluje się. I wyp...a się przy wykonaniu. Ale zanim to jeszcze zdąży wyświetlić:

c:\c_proj\ConsoleApplication1\CA2>dotnet run
Project CA2 (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.

Unhandled Exception: System.ArgumentException: 'windows-1250' is not a supported encoding name. For information on defining a custom encoding, see the documenta
tion for the Encoding.RegisterProvider method.
Parameter name: name
   at System.Globalization.EncodingTable.internalGetCodePageFromName(String name)
   at System.Globalization.EncodingTable.GetCodePageFromName(String name)
   at System.Text.Encoding.GetEncoding(String name)
   at ConsoleApp1.Program.Main(String[] args) 

To, że windows-1250 jest nieznane miałem od razu. I szukałem jak się nazywa moja strona kodowa. Stąd ten kod dający listę stron kodowych. Czy jest gdzieś opisane co działa, a co nie działa z .NET Core? A może nadal coś źle robię?

1 użytkowników online, w tym zalogowanych: 0, gości: 1