dotnet/runtime

`ConsoleStream.ReadByte` throws when `Console.Encoding` is UTF-16

Open

#70 448 ouverte le 8 juin 2022

Voir sur GitHub
 (6 commentaires) (1 réaction) (0 assignés)C# (5 445 forks)batch import
area-System.Consolehelp wanted

Métriques du dépôt

Stars
 (17 886 stars)
Métriques de merge PR
 (Merge moyen 12j 11h) (661 PRs mergées en 30 j)

Description

Description

An IOException is thrown when invoking Stream.ReadByte on a stream obtained from Console.OpenStandardInput after having set Console.Encoding to Encoding.Unicode.

Reproduction Steps

using System;
using System.Text;

namespace ConsoleApp1;

class Program
{
    static void Main()
    {
        Console.InputEncoding = Encoding.Unicode;
        var stdin = Console.OpenStandardInput();
        _ = stdin.ReadByte();
    }
}

The same exception is also thrown if you invoke Stream.Read with a buffer of length 1:

static void Main()
{
    Console.InputEncoding = Encoding.Unicode;
    var stdin = Console.OpenStandardInput();
    Span<byte> bytes = stackalloc byte[1];
    _ = stdin.Read(bytes);
}

Expected behavior

Stream.ReadByte returns the least significant byte of the read code unit (and the most significant byte of the same code unit on the next Stream.ReadByte invocation).

-or-

A more descriptive exception (NotSupportedException?) with a more meaningful message is thrown if this is an explicitly unuspported scenario.

Actual behavior

The following exception is thrown:

System.IO.IOException
  HResult=0x80070023
  Message=Unknown error (0x23)
  Source=System.Console
  StackTrace:
   at System.ConsolePal.WindowsConsoleStream.Read(Span`1 buffer)
   at System.IO.ConsoleStream.ReadByte()
   at ConsoleApp1.Program.Main() in C:\ConsoleApp1\Program.cs:line 12

Regression?

No response

Known Workarounds

Invoking Stream.Read with a buffer of length 2 or more. You can also use Encoding.CreateTranscodingStream with both the inner and outer encodings set to UTF-16 to wrap the input stream.

Configuration

.NET Core 6.0.300 / .NET Framework 4.8 Windows 10 x64

Other information

No response

Guide contributeur