diff options
| -rw-r--r-- | src/binary/reader.rs | 13 | ||||
| -rw-r--r-- | tests/data/utf16_bplist.plist | bin | 0 -> 3301 bytes |
2 files changed, 12 insertions, 1 deletions
diff --git a/src/binary/reader.rs b/src/binary/reader.rs index f983efe..0504e13 100644 --- a/src/binary/reader.rs +++ b/src/binary/reader.rs @@ -216,7 +216,8 @@ impl<R: Read + Seek> EventReader<R> { } (0x6, n) => { // UTF-16 string - let len = try!(self.read_object_len(n)); + // n is the length of code units (16 bits), not bytes. + let len = try!(self.read_object_len(n * 2)); let raw = try!(self.read_data(len)); let mut cursor = Cursor::new(raw); @@ -333,4 +334,14 @@ mod tests { assert_eq!(events, comparison); } + + #[test] + fn utf16_plist() { + use PlistEvent::*; + + let reader = File::open(&Path::new("./tests/data/utf16_bplist.plist")).unwrap(); + let streaming_parser = EventReader::new(reader); + let events: Vec<PlistEvent> = streaming_parser.map(|e| e.unwrap()).collect(); + assert_eq!(events[39], StringValue("\u{2605} or better".to_owned())); + } } diff --git a/tests/data/utf16_bplist.plist b/tests/data/utf16_bplist.plist Binary files differnew file mode 100644 index 0000000..b1a6856 --- /dev/null +++ b/tests/data/utf16_bplist.plist |
