Issue #20424: Python implementation of io.StringIO now supports lone surrogates.
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index aab60db..a9b0064 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -2044,7 +2044,7 @@
     def __init__(self, initial_value="", newline="\n"):
         super(StringIO, self).__init__(BytesIO(),
                                        encoding="utf-8",
-                                       errors="strict",
+                                       errors="surrogatepass",
                                        newline=newline)
         # Issue #5645: make universal newlines semantics the same as in the
         # C version, even under Windows.
diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py
index d611a31..50c91ab 100644
--- a/Lib/test/test_memoryio.py
+++ b/Lib/test/test_memoryio.py
@@ -609,6 +609,15 @@
     UnsupportedOperation = pyio.UnsupportedOperation
     EOF = ""
 
+    def test_lone_surrogates(self):
+        # Issue #20424
+        memio = self.ioclass('\ud800')
+        self.assertEqual(memio.read(), '\ud800')
+
+        memio = self.ioclass()
+        memio.write('\ud800')
+        self.assertEqual(memio.getvalue(), '\ud800')
+
 
 class PyStringIOPickleTest(TextIOTestMixin, unittest.TestCase):
     """Test if pickle restores properly the internal state of StringIO.
diff --git a/Misc/NEWS b/Misc/NEWS
index c52ca18..8b24dc3 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -50,6 +50,8 @@
 Library
 -------
 
+- Issue #20424: Python implementation of io.StringIO now supports lone surrogates.
+
 - Issue #19456: ntpath.join() now joins relative paths correctly when a drive
   is present.