我有以 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# 只为 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
没有内置方法可以将字符打印为 C# 转义序列。
只需根据需要使用字典将字符映射到字符串:
var map = new Dictionary<char, string>{ {'\t', @"\t"}}
并在输出期间使用它来替换字符(如果存在于地图中)。
\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"));