[Python-checkins] cpython (merge 3.6 -> default): Issue #28321: Fixed writing non-BMP characters with binary format in plistlib.

serhiy.storchaka python-checkins at python.org
Tue Oct 4 13:09:38 EDT 2016


https://hg.python.org/cpython/rev/b6c85e7e558a
changeset:   104286:b6c85e7e558a
parent:      104283:927e05b747d1
parent:      104285:3a7234d04fe9
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Tue Oct 04 20:08:59 2016 +0300
summary:
  Issue #28321: Fixed writing non-BMP characters with binary format in plistlib.

files:
  Lib/plistlib.py           |  2 +-
  Lib/test/test_plistlib.py |  7 +++++++
  Misc/NEWS                 |  2 ++
  3 files changed, 10 insertions(+), 1 deletions(-)


diff --git a/Lib/plistlib.py b/Lib/plistlib.py
--- a/Lib/plistlib.py
+++ b/Lib/plistlib.py
@@ -918,7 +918,7 @@
                 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 --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py
--- a/Lib/test/test_plistlib.py
+++ b/Lib/test/test_plistlib.py
@@ -360,6 +360,13 @@
                                   plistlib.dumps,
                                   testString)
 
+    def test_non_bmp_characters(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):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -58,6 +58,8 @@
 Library
 -------
 
+- Issue #28321: Fixed writing non-BMP characters with binary format in plistlib.
+
 - Issue #28225: bz2 module now supports pathlib.  Initial patch by Ethan Furman.
 
 - Issue #28227: gzip now supports pathlib.  Patch by Ethan Furman.

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list