diff -r f4754416a726 Lib/plistlib.py --- a/Lib/plistlib.py Fri Sep 30 10:38:31 2016 +0300 +++ b/Lib/plistlib.py Sat Oct 01 09:32:50 2016 +0300 @@ -918,7 +918,7 @@ class _BinaryPlistWriter (object): self._write_size(0x50, len(value)) except UnicodeEncodeError: t = value.encode('utf-16be') - self._write_size(0x60, len(value)) + self._write_size(0x60, len(t) // 2) self._fp.write(t) diff -r f4754416a726 Lib/test/test_plistlib.py --- a/Lib/test/test_plistlib.py Fri Sep 30 10:38:31 2016 +0300 +++ b/Lib/test/test_plistlib.py Sat Oct 01 09:32:50 2016 +0300 @@ -361,6 +361,13 @@ class TestPlistlib(unittest.TestCase): plistlib.dumps, testString) + def test_astralcharacters(self): + pl = {'python': '\U0001f40d'} + for fmt in ALL_FORMATS: + with self.subTest(fmt=fmt): + data = plistlib.dumps(pl, fmt=fmt) + self.assertEqual(plistlib.loads(data), pl) + def test_nondictroot(self): for fmt in ALL_FORMATS: with self.subTest(fmt=fmt):