2016-08-03 31 views
1
StringBuilder builder = new StringBuilder(); 
builder.Append(" \(Nested \(parentheses\) dont need a backslash.\) \(But a single \\(parenthe)"); 
for(int i=0;i<builder.Length;i++) 
{ 
    if(data[i] == "\" && data[i-1] == "\") 
     data[i] += " "; 
} 

Wenn zwei Backslash in einer Zeichenfolge vorhanden ist. Ich muss einen Zwischenraum zwischen ihnen hinzufügen. Im obigen Code erhalte ich den Fehler "stellt ein Zeichen als eine UTF-16-Code-Einheit dar" bei Bedingung. Weil ich damit eine PDF-Datei erstelle. Danke im Voraus.stellt ein Zeichen als UTF-16-Codeeinheit dar.

+0

Ihr Code wird nicht einmal kompilieren. '\ 'bezeichnet eine Escape-Sequenz und' \ "' ist eigentlich die Möglichkeit, doppelte Anführungszeichen zu umgehen. Wie die Syntax-Einfärbung in der Frage selbst zeigt, ist '" \ "&& data [i-1] ==" 'tatsächlich eine einzelne Zeichenfolge –

Antwort

1

Die Nachricht, die Sie erhalten, wenn Sie mit der Maus über dieses Stück Code schwebt: "\" in dieser Zeile:

if (data[i] == "\" && data[i-1] == "\") 

ist eigentlich kein Fehler, sondern der Kommentar/Beschreibung der Klasse String.

Ein Backslash wird verwendet, um eine escape sequence zu bezeichnen. Die Dokumentation sagt:

Zeichenkombinationen bestehend aus einem Backslash (\) gefolgt von einem Buchstaben oder einer Kombination von Ziffern werden "Escape-Sequenzen" genannt. Um ein Zeilenvorschubzeichen, ein einfaches Anführungszeichen oder bestimmte andere Zeichen in einer Zeichenkonstante darzustellen, müssen Sie Escape-Sequenzen verwenden. Eine Escape-Sequenz wird als einzelnes Zeichen betrachtet und ist daher als Zeichenkonstante gültig.

Die Verwirrung entsteht, weil der Compiler denkt, dass Sie die " als ein Zeichen in der Zeichenfolge haben möchten, wenn Sie \" verwenden. Aus diesem Grund markiert Intellisense immer noch den Rest der Zeile in der Farbe string bis zu dem Punkt, wo es eine " ohne Backslash vor findet.

können Sie den @ Operator verwenden, um die Zeichenfolge zu zwingen, zu interpretieren, wie es ist, so wird ein Schrägstrich wird nur ein Zeichen:

if (data[i] == @"\" && data[i-1] == @"\") 

und Ihr Code wird übersetzbar.

Leider würde Ihre Schleife in der ersten Iteration brechen, wenn i 0 ist. Weil data nicht mit -1 indiziert werden kann. Ich würde einen anderen Ansatz vorschlagen, wenn Ihr Problem ist, ein Leerzeichen zwischen zwei aufeinanderfolgenden Backslashes zu setzen.

Sie konnten verwenden Sie einfach die Replace Methode wie folgt:

string s = @"\(Nested \(parentheses\) dont need a backslash.\) \(But a single \\(parenthe)"; 

s = s.Replace(@"\\", @"\ \"); 

Ich verstehe nicht ganz, welche Rolle die data Array im Code spielt, aber Sie können es auch tun, mit dem StringBuilder

StringBuilder builder = new StringBuilder(); 
builder.Append(@" \(Nested \(parentheses\) dont need a backslash.\) \(But a single \\(parenthe)"); 

builder.Replace(@"\\", @"\ \");