dotnet/runtime

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

Open

#70.448 aberto em 8 de jun. de 2022

Ver no GitHub
 (6 comments) (1 reaction) (0 assignees)C# (5.445 forks)batch import
area-System.Consolehelp wanted

Métricas do repositório

Stars
 (17.886 stars)
Métricas de merge de PR
 (Mesclagem média 12d 11h) (661 fundiu PRs em 30d)

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

Guia do colaborador