2012-09-06 147 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一樣好)。 。 –