bpo-42846: Convert CJK codec extensions to multiphase init (GH-24157)

Convert the 6 CJK codec extension modules (_codecs_cn, _codecs_hk,
_codecs_iso2022, _codecs_jp, _codecs_kr and _codecs_tw) to the
multiphase initialization API (PEP 489).

Remove getmultibytecodec() local cache: always import
_multibytecodec. It should be uncommon to get a codec. For example,
this function is only called once per CJK codec module.

Fix a reference leak in register_maps() error path.
diff --git a/Lib/test/test_multibytecodec.py b/Lib/test/test_multibytecodec.py
index 7c3b67f..3efa150 100644
--- a/Lib/test/test_multibytecodec.py
+++ b/Lib/test/test_multibytecodec.py
@@ -3,11 +3,15 @@
 #   Unit test for multibytecodec itself
 #
 
+import _multibytecodec
+import codecs
+import io
+import sys
+import textwrap
+import unittest
 from test import support
 from test.support import os_helper
 from test.support.os_helper import TESTFN
-import unittest, io, codecs, sys
-import _multibytecodec
 
 ALL_CJKENCODINGS = [
 # _codecs_cn
@@ -205,6 +209,24 @@ def test_issue5640(self):
         self.assertEqual(encoder.encode('\xff'), b'\\xff')
         self.assertEqual(encoder.encode('\n'), b'\n')
 
+    @support.cpython_only
+    def test_subinterp(self):
+        # bpo-42846: Test a CJK codec in a subinterpreter
+        import _testcapi
+        encoding = 'cp932'
+        text = "Python の開発は、1990 年ごろから開始されています。"
+        code = textwrap.dedent("""
+            import codecs
+            encoding = %r
+            text = %r
+            encoder = codecs.getincrementalencoder(encoding)()
+            text2 = encoder.encode(text).decode(encoding)
+            if text2 != text:
+                raise ValueError(f"encoding issue: {text2!a} != {text!a}")
+        """) % (encoding, text)
+        res = _testcapi.run_in_subinterp(code)
+        self.assertEqual(res, 0)
+
 class Test_IncrementalDecoder(unittest.TestCase):
 
     def test_dbcs(self):