mirror of
https://github.com/nodejs/node.git
synced 2025-12-28 07:50:41 +00:00
PR-URL: https://github.com/nodejs/node/pull/60893 Fixes: https://github.com/nodejs/node/issues/60888 Fixes: https://github.com/nodejs/node/issues/59515 Fixes: https://github.com/nodejs/node/issues/56542 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
64 lines
2.3 KiB
JavaScript
64 lines
2.3 KiB
JavaScript
'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)}`
|
||
);
|
||
}
|
||
});
|