Skip to content

ConsoleStream.ReadByte throws when Console.Encoding is UTF-16 #70448

Description

@castholm

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-System.Consolehelp wanted[up-for-grabs] Good issue for external contributorsin-prThere is an active PR which will close this issue when it is merged

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions