> [...String.fromCodePoint(0x10000)].length
1 // 1 codepoint
> require('iconv-lite').encode(String.fromCodePoint(0x10000), 'utf32', { addBOM: false })
<Buffer 00 00 01 00> // 1 codepoint
> require('iconv-lite').encode(String.fromCodePoint(0x10000), 'windows1252').toString()
'??' // two replacements?
This happens for all codepoints above 0xFFFF
Single-byte encodings map each byte to a codepoint directly, there is no reason for the encoder to spawn two replacements there