From 2bcc3175da7cd24a78c493bd2fa1f6d8e06336bb Mon Sep 17 00:00:00 2001 From: youdie006 Date: Fri, 2 Oct 2026 18:34:37 +0900 Subject: [PATCH] fix(convert): decode JIS X 0212 0x2237 to a single character EUCJPToUTF8() and JISToUTF8() always wrote at least two bytes for a JIS X 0212 table value, so 0x2237, which maps to ~, decoded to a NUL followed by ~. --- src/encoding-convert.js | 8 ++++++-- tests/test.js | 11 +++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/encoding-convert.js b/src/encoding-convert.js index bcdd154..83d5833 100644 --- a/src/encoding-convert.js +++ b/src/encoding-convert.js @@ -511,7 +511,9 @@ function EUCJPToUTF8(data) { if (utf8 === void 0) { results[results.length] = config.FALLBACK_CHARACTER; } else { - if (utf8 < 0xFFFF) { + if (utf8 < 0x80) { + results[results.length] = utf8; + } else if (utf8 < 0xFFFF) { results[results.length] = utf8 >> 8 & 0xFF; results[results.length] = utf8 & 0xFF; } else { @@ -609,7 +611,9 @@ function JISToUTF8(data) { if (utf8 === void 0) { results[results.length] = config.FALLBACK_CHARACTER; } else { - if (utf8 < 0xFFFF) { + if (utf8 < 0x80) { + results[results.length] = utf8; + } else if (utf8 < 0xFFFF) { results[results.length] = utf8 >> 8 & 0xFF; results[results.length] = utf8 & 0xFF; } else { diff --git a/tests/test.js b/tests/test.js index f55e487..0440ab0 100644 --- a/tests/test.js +++ b/tests/test.js @@ -1249,6 +1249,17 @@ describe('encoding', function() { assert.equal(decoded, '?'); }); + it('JIS X 0212 code point mapped to ASCII', function() { + // JIS X 0212 0x2237 maps to U+007E, a single UTF-8 byte. + var eucjp = [0x8F, 0xA2, 0xB7]; + var jis = [0x1B, 0x24, 0x28, 0x44, 0x22, 0x37, 0x1B, 0x28, 0x42]; + + assert.deepEqual(encoding.convert(eucjp, 'UTF8', 'EUCJP'), [0x7E]); + assert.deepEqual(encoding.convert(eucjp, 'UNICODE', 'EUCJP'), [0x7E]); + assert.deepEqual(encoding.convert(jis, 'UTF8', 'JIS'), [0x7E]); + assert.deepEqual(encoding.convert(jis, 'UNICODE', 'JIS'), [0x7E]); + }); + it('SJIS invalid trail byte 0x7F', function() { var invalidSjisCode = [0x81, 0x7F]; var validSjisCode = [0x81, 0x7E];