3

タブ文字が ASCII (09) または Unicode で割り当てられています

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

'\t'コンソール ウィンドウで印刷するにはどうすればよいですか?

以下のどれも機能しません。

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

推測、Console.Write()それを行う正しい方法ではありません

4

4 に答える 4

7

制御文字は表示されません。これが制御文字の要点だからです。テキストの一部にタブを付ける理由は、結局のところ、タブを持つためです。

理想的には、標準の記号を使用できます␀␁␂␃␄␅␆␇␈␉␊␋␌␍␎␏␐␑␒␓␔␕␖␗␘␙␚␛␜␝␞␟␠␡␤␥␦が、それらは優れたフォント サポートを持っていません (現在、私が見ているように、フォーム 2 の削除とフォーム 2 の置換の記号は正しく表示されていません)、これはコンソールではさらに悪化します。

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
于 2012-09-07T10:05:19.613 に答える
2

文字を C# エスケープ シーケンスとして出力する組み込みの方法はありません。

必要に応じて、辞書を使用して文字を文字列にマップするだけです。

var map = new Dictionary<char, string>{ {'\t', @"\t"}}

また、出力中に文字を置き換えるために使用します (マップに存在する場合)。

于 2012-09-06T22:27:01.073 に答える
0

これを試して:

    string tab = "\u0009";
    Console.Write(tab.Replace(tab, "\\t"));
于 2012-09-06T22:36:40.300 に答える
0

\t には特別な意味 (タブ) があるため、印刷したい場合は '\' をエスケープする必要があります。

Console.Writeline("\tHello World");
prints:     Hello World

Console.Writeline("\\tHello World");
prints: \tHello World

@-Syntax を使用して、\t、\n、\'... の特別な意味を削除することもできます。

于 2012-09-06T22:43:43.587 に答える