'use strict'; const common = require('../common'); const test = require('node:test'); const assert = require('node:assert'); test('TextDecoder correctly decodes windows-1252 encoded data', { skip: !common.hasIntl }, () => { const latin1Bytes = new Uint8Array([0xc1, 0xe9, 0xf3]); const expectedString = 'Áéó'; const decoder = new TextDecoder('windows-1252'); const decodedString = decoder.decode(latin1Bytes); assert.strictEqual(decodedString, expectedString); }); // Test for the difference between Latin1 and Windows-1252 in the 128-159 // range // Ref: https://github.com/nodejs/node/issues/60888 test('TextDecoder correctly decodes windows-1252 special characters in ' + '128-159 range', { skip: !common.hasIntl }, () => { const decoder = new TextDecoder('windows-1252'); // Test specific characters that differ between Latin1 and Windows-1252. // € Euro sign assert.strictEqual(decoder.decode(Uint8Array.of(128)).codePointAt(0), 8364); // ‚ Single low-9 quotation mark assert.strictEqual(decoder.decode(Uint8Array.of(130)).codePointAt(0), 8218); // Latin small letter f with hook (ƒ) assert.strictEqual(decoder.decode(Uint8Array.of(131)).codePointAt(0), 402); // Ÿ Latin capital letter Y with diaeresis assert.strictEqual(decoder.decode(Uint8Array.of(159)).codePointAt(0), 376); // Test the full range to ensure no character is treated as Latin1 // Directly. const expectedMappings = [ [128, 8364], [129, 129], [130, 8218], [131, 402], [132, 8222], [133, 8230], [134, 8224], [135, 8225], [136, 710], [137, 8240], [138, 352], [139, 8249], [140, 338], [141, 141], [142, 381], [143, 143], [144, 144], [145, 8216], [146, 8217], [147, 8220], [148, 8221], [149, 8226], [150, 8211], [151, 8212], [152, 732], [153, 8482], [154, 353], [155, 8250], [156, 339], [157, 157], [158, 382], [159, 376], ]; for (const [byte, expectedCodePoint] of expectedMappings) { const result = decoder.decode(Uint8Array.of(byte)); const actualCodePoint = result.codePointAt(0); assert.strictEqual( actualCodePoint, expectedCodePoint, `Byte 0x${byte.toString(16)} should decode to ` + `U+${expectedCodePoint.toString(16)} but got ` + `U+${actualCodePoint.toString(16)}` ); } });