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编码,但我只想知道它将如何读取。
由于我没有收到太多回应,我决定自己做一些测试。我写了一个具有不同字节宽度的 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 输出。