我已經分配了ASCII(09)或Unicode製表符如何打印控制字符在控制檯窗口
char ch = '\x09';
(or)
char ch = '\u0009';
如何在控制檯窗口打印'\t'
?
無下面的作品。(也許它打印標籤,而不是作爲「\ t」的規範表示)
Console.Write(ch);
Console.Write(ch.ToString())
猜想,Console.Write()
是不要做
我已經分配了ASCII(09)或Unicode製表符如何打印控制字符在控制檯窗口
char ch = '\x09';
(or)
char ch = '\u0009';
如何在控制檯窗口打印'\t'
?
無下面的作品。(也許它打印標籤,而不是作爲「\ t」的規範表示)
Console.Write(ch);
Console.Write(ch.ToString())
猜想,Console.Write()
是不要做
沒有內置的方式來打印字符作爲C#轉義序列。
只需使用字典字符的字符串作爲需要映射:
var map = new Dictionary<char, string>{ {'\t', @"\t"}}
並用它來替換字符(如果出現在地圖)輸出時。
這太有意思了。所以我打開單聲道解釋器並輸入'char ch ='\ x09'; ch;',boom,我得到輸出爲'\ t'。不知道爲什麼這在控制檯窗口中如此複雜。 –
它更復雜,因爲控制檯窗口設計用於實際輸出,而不僅僅用於調試。有人輸出標籤到控制檯窗口的時間有99.99999%,這是因爲他們想要一個標籤,而不是標籤的轉義。 –
@AntonyThomas,VS有類似的行爲(你可以很容易地通過大量的「如何從我的字符串中刪除轉義序列」問題) - 即時窗口和調試工具提示/變量視圖顯示編碼字符串,但實際的控制檯輸出不(因爲你確實不希望在命令提示符中看到文本,或者所有字符都被編碼的文件)。 –
試試這個:
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,\」 ...
控制,不顯示字符,因爲這是整點一個控制字符。畢竟,在一篇文章中加入標籤的原因是要有一個標籤。
理想情況下,我們可以使用標準符號␀␁␂␃␄␅␆␇␈␉␊␋␌␍␎␏␐␑␒␓␔␕␖␗␘␙␚␛␜␝␞␟␠␡␥␦
,但它們沒有很好的字體支持(現在我看到它,刪除表格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
我認爲規範形式是標準化的''\ t'',但是如果我的錯誤是錯的,我很遺憾。儘管如此,我瞭解你關於不可打印字符的觀點是無法打印的。我開始這篇文章的原因是這個簡單的實驗(由超出範圍的原因驅動);在python解釋器中,我輸入'a ='\ x09''和'str(a)'或者只是'a',它會顯示出'\ t''。然後在單聲道解釋器中輸入'char ch ='\ x09'; ch;'它也顯示我'\ t''。但我不能在C#控制檯中獲得它。無論如何,謝謝你的詳細答案。 –
[1]關於規範鏈接http://stackoverflow.com/questions/1167371/what-does-canonical-representation-mean-and-its-potential-vulnerability-to-websi –
在單聲道控制檯,你會得到一個真正的標籤太。解釋者將幫助你調試和嘗試一些東西,所以'\ t'很有用,但是控制檯適用於大多數情況下'\ t'無用的實際工作(那麼你怎樣才能真正輸出一個標籤?)。 「規範」意味着「一種將同樣數據的同等有效表示選擇限制爲單一免選格式的方法」。上面給出的'U + 0009'是Unicode語言不可知的方式來表示獨立於它的字形或缺少字符的標準形式(所以它對於標籤與A,B或C一樣好)。 。 –
做喲你想要一個表示所有的控制,或只是爲U + 0009? –
所有控制字符。即使在單聲道解釋器或VS的Roslyn插件中,我也可以很容易地在Python中獲得它。但是無法在控制檯窗口中找到它。 –