2012-09-06 121 views
2

我已经分配了ASCII(09)或Unicode制表符如何打印控制字符在控制台窗口

char ch = '\x09'; 
(or) 
char ch = '\u0009'; 

如何在控制台窗口打印'\t'

无下面的作品。(也许它打印标签,而不是作为“\ t”的规范表示)

Console.Write(ch); 
Console.Write(ch.ToString()) 

猜想,Console.Write()是不要做

+0

做哟你想要一个表示所有的控制,或只是为U + 0009? –

+0

所有控制字符。即使在单声道解释器或VS的Roslyn插件中,我也可以很容易地在Python中获得它。但是无法在控制台窗口中找到它。 –

回答

2
正道

没有内置的方式来打印字符作为C#转义序列。

只需使用字典字符的字符串作为需要映射:

var map = new Dictionary<char, string>{ {'\t', @"\t"}} 

并用它来替换字符(如果出现在地图)输出时。

+0

这太有意思了。所以我打开单声道解释器并输入'char ch ='\ x09'; ch;',boom,我得到输出为'\ t'。不知道为什么这在控制台窗口中如此复杂。 –

+0

它更复杂,因为控制台窗口设计用于实际输出,而不仅仅用于调试。有人输出标签到控制台窗口的时间有99.99999%,这是因为他们想要一个标签,而不是标签的转义。 –

+2

@AntonyThomas,VS有类似的行为(你可以很容易地通过大量的“如何从我的字符串中删除转义序列”问题) - 即时窗口和调试工具提示/变量视图显示编码字符串,但实际的控制台输出不(因为你确实不希望在命令提示符中看到文本,或者所有字符都被编码的文件)。 –

0

试试这个:

string tab = "\u0009"; 
    Console.Write(tab.Replace(tab, "\\t")); 
+0

我无法将其推广到其他控制字符。我应该说清楚。 –

0

\ T具有特殊的含义(标签),所以如果你想打印它,你需要逃脱“\”。

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

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

您也可以使用@句法的去除的\ t时的特殊含义,\ n,\” ...

6

控制,不显示字符,因为这是整点一个控制字符。毕竟,在一篇文章中加入标签的原因是要有一个标签。

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

你也不清楚你的问题是你想要求正则表达式(U+0009)还是C#转义(\t),因为你在询问另一个请求之后要求一个权限(“''的规范表示形式' “)。

假设后者,我们遇到了一个问题,即C#仅为8个控制字符提供了这种快捷转义。这个过程也需要我们逃脱\出于同样的原因,C#做 - 除此之外,我们可以检测是否\t意味着选项卡,或意味着\其次是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 

字符串:

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()); 

输出:

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 
+0

我认为规范形式是标准化的''\ t'',但是如果我的错误是错的,我很遗憾。尽管如此,我了解你关于不可打印字符的观点是无法打印的。我开始这篇文章的原因是这个简单的实验(由超出范围的原因驱动);在python解释器中,我输入'a ='\ x09''和'str(a)'或者只是'a',它会显示出'\ t''。然后在单声道解释器中输入'char ch ='\ x09'; ch;'它也显示我'\ t''。但我不能在C#控制台中获得它。无论如何,谢谢你的详细答案。 –

+0

[1]关于规范链接http://stackoverflow.com/questions/1167371/what-does-canonical-representation-mean-and-its-potential-vulnerability-to-websi –

+1

在单声道控制台,你会得到一个真正的标签太。解释者将帮助你调试和尝试一些东西,所以'\ t'很有用,但是控制台适用于大多数情况下'\ t'无用的实际工作(那么你怎样才能真正输出一个标签?)。 “规范”意味着“一种将同样数据的同等有效表示选择限制为单一免选格式的方法”。上面给出的'U + 0009'是Unicode语言不可知的方式来表示独立于它的字形或缺少字符的标准形式(所以它对于标签与A,B或C一样好)。 。 –