Console.Read的编码

时间:2016-01-17 12:56:24

标签: c# .net encoding console

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

编辑:文本文件采用UTF-8编码,但我只是想知道如何阅读。

1 个答案:

答案 0 :(得分:0)

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

doc = Document();

对于那些无法正确阅读的人,这里是一个hexdump:

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> 对输出没有影响。)如您所见,它可以很好地读取Basic Multilingual Plane中的字符。但是,当你开始进入补充平面时,它就像UTF-16一样,并开始输出代理字符。然而,这些代理人仍然正确编码原始字符,这使我得出结论:

Console.InputEncoding = Encoding.UTF8;可以读取UTF-8,但输出为UTF-16。