@@ -123,96 +123,81 @@ void WriteStringValue(string val)
123123
124124 string EscapeCharacters ( string sval , bool EscapeSlash )
125125 {
126- var sb = new StringBuilder ( sval ) ;
126+ var sb = new StringBuilder ( ) ;
127127
128- int Length = sval . Length ;
129- for ( var i = 0 ; i < Length ; i ++ )
128+ int length = sval . Length ;
129+ int start = 0 ;
130+
131+ for ( var i = 0 ; i < length ; i ++ )
130132 {
131- char c = sb [ i ] ;
133+ char c = sval [ i ] ;
134+ string ? escapedValue = null ;
135+
132136 if ( EscapeSlash && c == '/' )
133137 {
134- sb . Replace ( "/" , "\\ /" , i , 1 ) ;
135- Length ++ ;
136- i ++ ;
138+ escapedValue = "\\ /" ;
137139 }
138140 else if ( _settings . EscapeAmpersand && c == '&' )
139141 {
140- sb . Replace ( "&" , "\\ &" , i , 1 ) ;
141- Length ++ ;
142- i ++ ;
142+ escapedValue = "\\ &" ;
143143 }
144144 else if ( ( _settings . EscapeSingleQuotes || ! _settings . UseDoubleQuotes ) && c == '\' ' )
145145 {
146- sb . Replace ( "'" , "\\ u0027" , i , 1 ) ;
147- Length = Length + 5 ;
148- i = i + 5 ;
146+ escapedValue = "\\ u0027" ;
149147 }
150148 else if ( _settings . EscapeAngleBrackets && c == '<' )
151149 {
152- sb . Replace ( "<" , "\\ u003C" , i , 1 ) ;
153- Length = Length + 5 ;
154- i = i + 5 ;
150+ escapedValue = "\\ u003C" ;
155151 }
156152 else if ( _settings . EscapeAngleBrackets && c == '>' )
157153 {
158- sb . Replace ( ">" , "\\ u003E" , i , 1 ) ;
159- Length = Length + 5 ;
160- i = i + 5 ;
154+ escapedValue = "\\ u003E" ;
161155 }
162156 else if ( c == '\r ' )
163157 {
164- sb . Replace ( "\r " , "\\ r" , i , 1 ) ;
165- Length ++ ;
166- i ++ ;
158+ escapedValue = "\\ r" ;
167159 }
168160 else if ( c == '\n ' )
169161 {
170- sb . Replace ( "\n " , "\\ n" , i , 1 ) ;
171- Length ++ ;
172- i ++ ;
162+ escapedValue = "\\ n" ;
173163 }
174164 else if ( c == '\f ' )
175165 {
176- sb . Replace ( "\f " , "\\ f" , i , 1 ) ;
177- Length ++ ;
178- i ++ ;
166+ escapedValue = "\\ f" ;
179167 }
180168 else if ( c == '\" ' )
181169 {
182- sb . Replace ( "\" " , "\\ \" " , i , 1 ) ;
183- Length ++ ;
184- i ++ ;
170+ escapedValue = "\\ \" " ;
185171 }
186172 else if ( c == '\b ' )
187173 {
188- sb . Replace ( "\b " , "\\ b" , i , 1 ) ;
189- Length ++ ;
190- i ++ ;
174+ escapedValue = "\\ b" ;
191175 }
192176 else if ( c == '\t ' )
193177 {
194- sb . Replace ( "\t " , "\\ t" , i , 1 ) ;
195- Length ++ ;
196- i ++ ;
178+ escapedValue = "\\ t" ;
197179 }
198180 else if ( c == '\\ ' )
199181 {
200- sb . Replace ( "\\ " , "\\ \\ " , i , 1 ) ;
201- Length ++ ;
202- i ++ ;
182+ escapedValue = "\\ \\ " ;
203183 }
204184
205185 // Спец. символы: \u0000, \u0001, \u0002, ... , \u001e, \u001f;
206186 else if ( ( int ) c >= 0 && ( int ) c <= 31 )
207187 {
208- string unicode = "\\ u" + ( ( int ) c ) . ToString ( "X4" ) . ToLower ( ) ;
209- sb . Replace ( c . ToString ( ) , unicode , i , 1 ) ;
210- Length = Length + 5 ;
211- i = i + 5 ;
188+ escapedValue = "\\ u" + ( ( int ) c ) . ToString ( "x4" ) ;
212189 }
213190
191+ if ( escapedValue != null )
192+ {
193+ sb . Append ( sval , start , i - start ) ;
194+ sb . Append ( escapedValue ) ;
195+ start = i + 1 ;
196+ }
214197 }
198+
215199 sb . Insert ( 0 , _writer . QuoteChar ) ;
200+ sb . Append ( sval , start , length - start ) ;
216201 sb . Append ( _writer . QuoteChar ) ;
217202 return sb . ToString ( ) ;
218203 }
0 commit comments