2016-08-05 7 views
0

Welche Optionen sind verfügbar, um alle Zeichen einschließlich nicht druckbarer oder Leerzeichen (wie Newline, Tab usw.) in einer C# Zeichenfolge als String anzuzeigen?Möglichkeit, nicht druckbare Zeichen in Zeichenketten anzuzeigen

Dies würde getan werden, damit Zeichenfolgen auf eine Weise ausgeloggt werden können, die es dem Protokoll-Viewer ermöglicht, diese Zeichen zu sehen.

Zum Beispiel angesichts der string:

hello 
there 
    again 

... Ich könnte versuchen, "selten verwendet" druckbare Zeichen zu verwenden, so dass das Ergebnis wie folgt aussehen würde:

hello¶there¶·again 

... oder vielleicht könnte ich eine Kennung verwenden, von der ich weiß, dass sie in der Zeichenfolge nicht erwartet wird, z. B. ein umgekehrter Schrägstrich:

Ich habe über die Verwendung von etwas wie Regex.Replace oder String.Replace nachgedacht, aber ich kann nicht herausfinden, wie man alle Leerzeichen/nicht druckbare Zeichen "abbildet", ohne manuell jedes Zeichen zu spezifizieren, das ich zuordnen möchte. Wäre das wirklich die beste Option?

+0

Übrigens ist dies für ein Windows-Konsolen-Projekt - keine RichTextBox usw. –

+0

Ich würde sagen, dass Ihre Idee wahrscheinlich der beste Weg ist. Sie müssen es nicht weiter komplizieren, da Sie nur ein nicht druckbares Zeichen durch ein anderes ersetzen möchten. Ersetzen Sie es einfach. –

+0

@DanielWaghorn danke - Ich bin neugierig, ob andere sich schon einmal mit so etwas beschäftigt haben und welche Lösungen für sie funktionierten. –

Antwort

0

Sobald Sie definiert haben, welche Zeichen angezeigt werden sollen, können Sie die Zeichen durchlaufen und jedes nicht druckbare Zeichen durch das numerische Äquivalent ersetzen. Etwas wie:

var sb = new StringBuilder(); 

foreach (char c in s) 
{ 
    if (32 <= c && c <= 126) 
    { 
     sb.Append(c); 
    } 
    else 
    { 
     sb.AppendFormat("{{{0}}}", (int)c); 
    } 
} 
Console.WriteLine(sb.ToString()); 

Oder eine kürzere Einzeiler, obwohl ich weiß nicht, ob dies auch als StringBuilder auf großen Saiten durchführen wird:

// There might be a better LINQ query, but this works: 
var result = string.Join(string.Empty, 
    s.Select(c => (32 <= c && c <= 126) 
     ? c.ToString() 
     : string.Format("{{{0}}}", (int)c)) 
    .ToArray() 
); 

Unabhängig davon, was Sie tun, machen Denken Sie daran, was passiert, wenn Ihr Ersatzzeichen/String tatsächlich Teil der ursprünglichen Zeichenfolge ist. Wenn sich beispielsweise {711} in Ihrer Quellzeichenfolge befindet, ist die Zielzeichenfolge nicht in der Lage, den Unterschied zwischen dem Platzhalter und dem ursprünglichen Zeichen zu erkennen.