Encoding of Console.Read

本文关键字:Read Console of Encoding | 更新日期: 2023-09-27 18:30:46

我目前正在开发一个应用程序,该应用程序从控制台获取输入,但也支持输入重定向。为此,我通常使用Console.Read来接收单个字符。但是,我找不到任何说明它使用的编码的资源(ASCII?UTF-16?UTF-8?<随机代码页>?),Console.InputEncoding似乎只影响来自控制台的直接输入。它使用什么编码,如果可能的话,我该如何更改它?

编辑:文本文件以UTF-8编码,但我只想知道它将如何读取。

Encoding of Console.Read

由于我没有收到太多回应,我决定自己做一些测试。我写了一个具有不同字节宽度的 UTF-8 文件:

0123456789: Basic Latin, 1 byte
٠١٢٣٤٥٦٧٨٩: Arabic, 2 bytes
₀₁₂₃₄₅₆₇₈₉: Superscripts and Subscripts, 3 bytes
                    : Mathematical Alphanumeric Symbols, 4 bytes

对于那些无法正确阅读它的人,这里有一个十六进制转储:

0000000: 3031 3233 3435 3637 3839 3a20 4261 7369  0123456789: Basi
0000010: 6320 4c61 7469 6e2c 2031 2062 7974 650a  c Latin, 1 byte.
0000020: d9a0 d9a1 d9a2 d9a3 d9a4 d9a5 d9a6 d9a7  ................
0000030: d9a8 d9a9 3a20 4172 6162 6963 2c20 3220  ....: Arabic, 2 
0000040: 6279 7465 730a e282 80e2 8281 e282 82e2  bytes...........
0000050: 8283 e282 84e2 8285 e282 86e2 8287 e282  ................
0000060: 88e2 8289 3a20 5375 7065 7273 6372 6970  ....: Superscrip
0000070: 7473 2061 6e64 2053 7562 7363 7269 7074  ts and Subscript
0000080: 732c 2033 2062 7974 6573 0af0 9d9f 8ef0  s, 3 bytes......
0000090: 9d9f 8ff0 9d9f 90f0 9d9f 91f0 9d9f 92f0  ................
00000a0: 9d9f 93f0 9d9f 94f0 9d9f 95f0 9d9f 96f0  ................
00000b0: 9d9f 973a 204d 6174 6865 6d61 7469 6361  ...: Mathematica
00000c0: 6c20 416c 7068 616e 756d 6572 6963 2053  l Alphanumeric S
00000d0: 796d 626f 6c73 2c20 3420 6279 7465 730a  ymbols, 4 bytes.

现在,我编写了一个简单的程序来输出它读取的代码点:

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("Codepoints:");
        for (int cur = Console.Read(); cur != -1; cur = Console.Read())
            Console.WriteLine("U+{0:X4}", cur);
    }
}

现在,这是在我的测试文件上运行时的输出:

Codepoints:
U+0030
U+0031
U+0032
U+0033
U+0034
U+0035
U+0036
U+0037
U+0038
U+0039
<cut>
U+0660
U+0661
U+0662
U+0663
U+0664
U+0665
U+0666
U+0667
U+0668
U+0669
<cut>
U+2080
U+2081
U+2082
U+2083
U+2084
U+2085
U+2086
U+2087
U+2088
U+2089
<cut>
U+D835
U+DFCE
U+D835
U+DFCF
U+D835
U+DFD0
U+D835
U+DFD1
U+D835
U+DFD2
U+D835
U+DFD3
U+D835
U+DFD4
U+D835
U+DFD5
U+D835
U+DFD6
U+D835
U+DFD7
<cut>

(正如我所怀疑的那样,添加Console.InputEncoding = Encoding.UTF8;对输出没有影响。如您所见,它可以很好地读取基本多语言平面中的字符。但是,当您开始进入补充平面时,它的作用类似于 UTF-16 并开始输出代理项字符。但是,这些代理项仍然正确编码原始字符,这使我得出了结论:

Console.Read可以读取 UTF-8,但以 UTF-16 输出。