`ConsoleStream.ReadByte` throws when `Console.Encoding` is UTF-16
#70,448 建立於 2022年6月8日
倉庫指標
- Star
- (17,886 star)
- PR 合併指標
- (平均合併 12天 11小時) (30 天內合併 661 個 PR)
描述
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