Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在控制台窗口中打印控制字符_C# - Fatal编程技术网

C# 如何在控制台窗口中打印控制字符

C# 如何在控制台窗口中打印控制字符,c#,C#,我使用ASCII(09)或Unicode指定制表符 char ch = '\x09'; (or) char ch = '\u0009'; 如何在控制台窗口中打印'\t' 以下各项都不起作用。(可能它打印了一个选项卡,但不是作为“\t”的规范表示形式) 猜一猜,Console.Write()不是正确的方法没有内置的方法将字符打印为C#转义序列 只需根据需要使用字典将字符映射到字符串: var map = new Dictionary<char, string>{ {'\t', @"\

我使用ASCII(09)或Unicode指定制表符

char ch = '\x09';
(or)
char ch = '\u0009';
如何在控制台窗口中打印
'\t'

以下各项都不起作用。(可能它打印了一个选项卡,但不是作为“\t”的规范表示形式)


猜一猜,
Console.Write()
不是正确的方法

没有内置的方法将字符打印为C#转义序列

只需根据需要使用字典将字符映射到字符串:

var map = new Dictionary<char, string>{ {'\t', @"\t"}}
var-map=newdictionary{{{'\t',@'\t}
并在输出过程中使用它替换字符(如果地图中存在)。

尝试以下操作:

    string tab = "\u0009";
    Console.Write(tab.Replace(tab, "\\t"));
\t有一个特殊的含义(一个标签),所以如果你想打印它,你需要转义“\”

Console.Writeline("\tHello World");
prints:     Hello World

Console.Writeline("\\tHello World");
prints: \tHello World

您还可以使用@-语法删除控制字符不显示的\t、\n、\'…

的特殊含义,因为这是控制字符的全部要点。在文本中添加制表符的原因毕竟是为了有一个制表符

理想情况下,我们可以使用标准符号
␀␁␂␃␄␅␆␇␈␉␊␋␌␍␎␏␐␑␒␓␔␕␖␗␘␙␚␛␜␝␞␟␠␡␤␥␦
但是它们没有很好的字体支持(在我看来,现在删除表单二和替代表单二的符号没有正确显示),控制台的情况更糟

在你的问题中,你也不清楚你是想要标准表示法(
U+0009
)还是C#转义法(
\t
),因为你在要求另一个(“一个'\t'的标准表示法”)之后就要求一个

假设是后者,我们有一个问题,C#只为8个控制字符提供了这样的捷径转义。这个过程还需要我们跳出
\
,原因与C一样——否则我们如何检测
\t
是指tab,还是指
\
后面跟着
t

因此,假设您需要一个可以直接在C#中使用的表单,我们可以执行以下操作:

public static class StringEscaper
{
    public static string EscapeForCSharp(this string str)
    {
        StringBuilder sb = new StringBuilder();
        foreach(char c in str)
            switch(c)
            {
                case '\'': case '"': case '\\':
                    sb.Append(c.EscapeForCSharp());
                    break;
                default:
                    if(char.IsControl(c))
                        sb.Append(c.EscapeForCSharp());
                    else
                        sb.Append(c);
                    break;
            }
        return sb.ToString();
    }
    public static string EscapeForCSharp(this char chr)
    {
        switch(chr)
        {//first catch the special cases with C# shortcut escapes.
            case '\'':
                return @"\'";
            case '"':
                return "\\\"";
            case '\\':
                return @"\\";
            case '\0':
                return @"\0";
            case '\a':
                return @"\a";
            case '\b':
                return @"\b";
            case '\f':
                return @"\f";
            case '\n':
                return @"\n";
            case '\r':
                return @"\r";
            case '\t':
                return @"\t";
            case '\v':
                return @"\v";
            default:
                //we need to escape surrogates with they're single chars,
                //but in strings we can just use the character they produce.
                if(char.IsControl(chr) || char.IsHighSurrogate(chr) || char.IsLowSurrogate(chr))
                    return @"\u" + ((int)chr).ToString("X4");
                else
                    return new string(chr, 1);
        }
    }
}
现在我们可以用一个字符串和一个字符来测试它

单字符:

Console.WriteLine('\t'.EscapeForCSharp());
产出:

\t
The following string contains all the \"C0\" and \"C1\" controls, escaped with \\ as per C# syntax: \0\u0001\u0002\u0003\u0004\u0005\u0006\a\b\t\n\v\f\r\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u007F\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F
字符串:

string str = "The following string contains all the \"C0\" and \"C1\" controls, escaped with \\ as per C# syntax: "
  + "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u007F\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F";
Console.WriteLine(str.EscapeForCSharp());
产出:

\t
The following string contains all the \"C0\" and \"C1\" controls, escaped with \\ as per C# syntax: \0\u0001\u0002\u0003\u0004\u0005\u0006\a\b\t\n\v\f\r\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u007F\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F

是否要为所有控件或仅为U+0009指定一个表示形式?所有控件字符。我可以很容易地在Python中获得它,甚至在mono解释器或Roslyn plugin for VS中也可以。但是在控制台窗口中无法获得它。我无法将它推广到其他控制字符。我应该说清楚,这太有趣了。因此,我启动mono解释器并键入
charch='\x09';ch然后,砰的一声,我得到的输出是'\t'。不确定为什么控制台窗口中的操作如此复杂。更复杂的是,控制台窗口设计用于实际输出,而不仅仅用于调试。99.99999%的情况下,有人将一个选项卡输出到控制台窗口,这是因为他们想要一个选项卡,而不是选项卡的转义。@Antonythonas,VS有类似的行为(你可以通过大量的“如何从我的字符串中删除转义序列”问题很容易发现)-即时窗口和调试工具提示/变量视图显示编码字符串,但实际的控制台输出却不是这样(因为您真的不希望看到命令提示符中的文本或所有字符都已编码的文件)。是的,有一个讽刺意味的是,在这里,我们经常会遇到完全相反的问题。我原以为规范形式是标准化的
'\t'
,根据[1],但如果我的措辞错误,请原谅。尽管如此,我理解你们关于不可打印字符不能打印的观点。我开始写这篇文章的原因是这个简单的实验(由超出范围的原因驱动);在python解释器中,我键入
a='\x09'
str(a)
或只是
a
,它会显示
'\t'
。然后在单声道解释器中输入
charch='\x09';ch,它还显示了
'\t'
。但我就是无法在c#console中获取它。无论如何,谢谢你详尽的回答。[1]在mono控制台中,你也可以看到一个关于canonical的链接。解释器将帮助您调试和尝试事物,因此
\t
非常有用,但控制台用于实际工作,而
\t
在大多数情况下都是无用的(那么您如何实际输出选项卡?)。“规范”是指“将相同数据的同等有效表示形式的选择限制为单一选择自由格式的方法”。我上面给出的
U+0009
是Unicode语言不可知方式的标准形式,用于表示一个字符,而不依赖于它的字形或缺少字形(因此它对tab和a、B或C同样有效)。。。。。。没有规范的C#escape,因为C#被设计为由人编写,而不是作为源文件生成和交换,所以没有必要说
\t
\u0009
或甚至比``直接在源代码中'更规范。感谢您的观点。我很蠢,竟争抢0.000001%的控制台使用率。