我在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()
不是正确的方法
␀␁␂␃␄␅␆␇␈␉␊␋␌␍␎␏␐␑␒␓␔␕␖␗␘␙␚␛␜␝␞␟␠␡␥␦
,但它们的字体支持不太好(就我目前看到的情况而言,删除表二和替代表二的符号未正确显示),在控制台上更糟糕。U+0009
)还是C#转义(\t
),因为你一问完一个又问另一个(“'\t'的规范化表示”)。\
进行转义,原因与C#相同——否则我们如何检测\t
是指制表符,还是指后面跟着t
的\
呢?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'
,参考[1],但如果我用词不当,请原谅。无论如何,我理解您所说的非可打印字符无法打印的观点。我发起这篇帖子的原因是进行了这个简单的实验(由超出范围的原因驱动); 在Python解释器中,我键入a='\x09'
和str(a)
或只是a
,它会显示'\t'
。然后在mono解释器中,我键入char ch = '\x09'; ch;
,它也显示'\t'
。但我就是无法在C#控制台中得到它。无论如何,感谢您详细的回答。 - Antony Thomas\t
很有用,但控制台是用于实际工作的地方,在大多数情况下\t
是无用的(那么您如何实际输出制表符呢?)。“规范”意味着“将同一数据的等效有效表示的选择限制为单个无选择格式的方法”。我上面提供的U+0009
是Unicode语言无关表示字符的规范形式,独立于其字形或缺失(因此它对于制表符、A、B或C同样有效)... - Jon Hanna\t
比 \u0009
或甚至比源代码中的
更加标准。 - Jon Hanna没有内置的方法可以将字符打印为C#转义序列。
只需使用字典将字符映射到所需的字符串即可:
var map = new Dictionary<char, string>{ {'\t', @"\t"}}
并在输出过程中使用它来替换字符(如果存在于映射中)。
char ch = '\x09'; ch;
,然后,瞬间,我得到了输出为'\t'的结果。不确定为什么在控制台窗口中会这么复杂。 - Antony Thomas\t有特殊含义(制表符),因此如果要打印它,则需要转义“\”。
Console.Writeline("\tHello World");
prints: Hello World
Console.Writeline("\\tHello World");
prints: \tHello World
你也可以使用@-语法来去除\t、\n、\'等特殊含义...
试试这个:
string tab = "\u0009";
Console.Write(tab.Replace(tab, "\\t"));