c# - 如何在控制台窗口中打印控制字符

标签 c#

我在 ASCII (09) 或 Unicode 中分配了制表符

char ch = '\x09';
(or)
char ch = '\u0009';

如何在控制台窗口中打印 '\t'

以下均无效。(也许它会打印一个制表符,但不是作为 '\t' 的规范表示)

Console.Write(ch);
Console.Write(ch.ToString())

猜猜,Console.Write() 不是正确的方法

最佳答案

控制字符不显示,因为那是控制字符的全部意义。毕竟在一段文本中放置制表符的原因是要有一个制表符。

理想情况下,我们可以使用标准符号 ␀␁␂␃␄␅␆␇␈␉␊␋␌␍␎␏␐␑␒␓␔␕␖␗␘␙␚␛␜␝␞␟␠␡␤␥␦但是它们没有很好的字体支持(就我所见,Delete Form Two 和 Subsitute Form Two 的符号显示不正确),这在控制台上更糟。

你也不清楚你的问题是你想要规范表示( 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# - 如何在控制台窗口中打印控制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12309104/

相关文章:

c# - CAML 查询仅选择顶级文件夹

c# - C# 中的数组列表

c# - 处理数据时显示对话框

c# - 在 VS2015 的 UWP 解决方案文件夹中创建了奇怪的子文件夹 "DTAR_08E86330_4835_4B5C_9E5A_61F37AE1A077_DTAR"

c# - 使用 XmlDocument 从 XML 中提取数据

c# - 测试一个类是否可以被序列化

c# - 调用和管理许多 http 请求的响应的最佳方式

c# - HTTP 错误 403.14 - 禁止访问 - 带 IIS Express 的 MVC 4

c# - 对象作为参数传递给另一个类,按值还是按引用?

c# - 如何获取特定角色的用户列表?