diff --git a/Lib/test/test_multibytecodec.py b/Lib/test/test_multibytecodec.py index d4923a31aef8356..4f008ef24c874a3 100644 --- a/Lib/test/test_multibytecodec.py +++ b/Lib/test/test_multibytecodec.py @@ -416,6 +416,23 @@ def test_streamwriter_strwrite(self): self.assertEqual(s.getvalue(), b'abcd') class Test_ISO2022(unittest.TestCase): + def test_jisx0213_plane2_mapping(self): + encoded = b'\x1b$(P};\x1b(B' + for encoding, char in (('iso2022_jp_3', '\u9b1d'), + ('iso2022_jp_2004', '\u9b1c')): + with self.subTest(encoding=encoding): + self.assertEqual(char.encode(encoding), encoded) + self.assertEqual(encoded.decode(encoding), char) + self.assertEqual(char.encode(encoding).decode(encoding), char) + for split in range(len(encoded) + 1): + with self.subTest(split=split): + decoder = codecs.getincrementaldecoder(encoding)() + decoded = decoder.decode(encoded[:split]) + decoded += decoder.decode(encoded[split:], final=True) + self.assertEqual(decoded, char) + reader = codecs.getreader(encoding)(io.BytesIO(encoded)) + self.assertEqual(reader.read(), char) + def test_g2(self): iso2022jp2 = b'\x1b(B:hu4:unit\x1b.A\x1bNi de famille' uni = ':hu4:unit\xe9 de famille' diff --git a/Misc/NEWS.d/next/Library/2026-10-26-21-20-00.gh-issue-160306.h7Lq2v.rst b/Misc/NEWS.d/next/Library/2026-10-26-21-20-00.gh-issue-160306.h7Lq2v.rst new file mode 100644 index 000000000000000..ad08d21ec3ff0d9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-10-26-21-20-00.gh-issue-160306.h7Lq2v.rst @@ -0,0 +1,2 @@ +Fix the :mod:`!iso2022_jp_3` codec decoding the JIS X 0213:2000 plane 2 +character at row 93, cell 27 as U+9B1C instead of U+9B1D. diff --git a/Modules/cjkcodecs/_codecs_iso2022.c b/Modules/cjkcodecs/_codecs_iso2022.c index 38a8a230c7ae450..aef996472dbd6fd 100644 --- a/Modules/cjkcodecs/_codecs_iso2022.c +++ b/Modules/cjkcodecs/_codecs_iso2022.c @@ -727,7 +727,7 @@ jisx0213_2000_2_decoder(const MultibyteCodec *codec, const unsigned char *data) { Py_UCS4 u; EMULATE_JISX0213_2000_DECODE_PLANE2_CHAR(config, u, data[0], data[1]) - if (TRYMAP_DEC_ST(jisx0213_2_bmp, u, data[0], data[1])) + else if (TRYMAP_DEC_ST(jisx0213_2_bmp, u, data[0], data[1])) ; else if (TRYMAP_DEC_ST(jisx0213_2_emp, u, data[0], data[1])) u |= 0x20000;