我已经分配了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中获得它。但是无法在控制台窗口中找到它。 –