@@ -331,21 +331,22 @@ pub fn escape_bytes(wr: &mut io::Writer, bytes: &[u8]) -> Result<(), io::IoError
331
331
332
332
for ( i, byte) in bytes. iter ( ) . enumerate ( ) {
333
333
let escaped = match * byte {
334
- b'"' => "\\ \" " ,
335
- b'\\' => "\\ \\ " ,
336
- b'\x08' => "\\ b" ,
337
- b'\x0c' => "\\ f" ,
338
- b'\n' => "\\ n" ,
339
- b'\r' => "\\ r" ,
340
- b'\t' => "\\ t" ,
334
+ b'"' => "\\ \" " . into_cow ( ) ,
335
+ b'\\' => "\\ \\ " . into_cow ( ) ,
336
+ b'\x08' => "\\ b" . into_cow ( ) ,
337
+ b'\x0c' => "\\ f" . into_cow ( ) ,
338
+ b'\n' => "\\ n" . into_cow ( ) ,
339
+ b'\r' => "\\ r" . into_cow ( ) ,
340
+ b'\t' => "\\ t" . into_cow ( ) ,
341
+ b'\x00' ...b'\x1f' | b'\x7f' => format ! ( "\\ u00{:0>2x}" , * byte) . into_cow ( ) ,
341
342
_ => { continue ; }
342
343
} ;
343
344
344
345
if start < i {
345
346
try!( wr. write ( bytes[ start..i] ) ) ;
346
347
}
347
348
348
- try!( wr. write_str ( escaped) ) ;
349
+ try!( wr. write_str ( escaped. deref ( ) ) ) ;
349
350
350
351
start = i + 1 ;
351
352
}
@@ -2731,6 +2732,9 @@ mod tests {
2731
2732
fn test_write_char ( ) {
2732
2733
check_encoder_for_simple ! ( 'a' , "\" a\" " ) ;
2733
2734
check_encoder_for_simple ! ( '\t' , "\" \\ t\" " ) ;
2735
+ check_encoder_for_simple ! ( '\u{0000}' , "\" \\ u0000\" " ) ;
2736
+ check_encoder_for_simple ! ( '\u{001b}' , "\" \\ u001b\" " ) ;
2737
+ check_encoder_for_simple ! ( '\u{007f}' , "\" \\ u007f\" " ) ;
2734
2738
check_encoder_for_simple ! ( '\u{00a0}' , "\" \u{00a0} \" " ) ;
2735
2739
check_encoder_for_simple ! ( '\u{abcd}' , "\" \u{abcd} \" " ) ;
2736
2740
check_encoder_for_simple ! ( '\u{10ffff}' , "\" \u{10ffff} \" " ) ;
0 commit comments