Spaces:
Runtime error
Runtime error
| // Node has always utf-8 | |
| const utf8Decoder = new TextDecoder('utf-8') | |
| const textDecoders = new Map([ | |
| ['utf-8', utf8Decoder], | |
| ['utf8', utf8Decoder] | |
| ]) | |
| function getDecoder (charset) { | |
| let lc | |
| while (true) { | |
| switch (charset) { | |
| case 'utf-8': | |
| case 'utf8': | |
| return decoders.utf8 | |
| case 'latin1': | |
| case 'ascii': // TODO: Make these a separate, strict decoder? | |
| case 'us-ascii': | |
| case 'iso-8859-1': | |
| case 'iso8859-1': | |
| case 'iso88591': | |
| case 'iso_8859-1': | |
| case 'windows-1252': | |
| case 'iso_8859-1:1987': | |
| case 'cp1252': | |
| case 'x-cp1252': | |
| return decoders.latin1 | |
| case 'utf16le': | |
| case 'utf-16le': | |
| case 'ucs2': | |
| case 'ucs-2': | |
| return decoders.utf16le | |
| case 'base64': | |
| return decoders.base64 | |
| default: | |
| if (lc === undefined) { | |
| lc = true | |
| charset = charset.toLowerCase() | |
| continue | |
| } | |
| return decoders.other.bind(charset) | |
| } | |
| } | |
| } | |
| const decoders = { | |
| utf8: (data, sourceEncoding) => { | |
| if (data.length === 0) { | |
| return '' | |
| } | |
| if (typeof data === 'string') { | |
| data = Buffer.from(data, sourceEncoding) | |
| } | |
| return data.utf8Slice(0, data.length) | |
| }, | |
| latin1: (data, sourceEncoding) => { | |
| if (data.length === 0) { | |
| return '' | |
| } | |
| if (typeof data === 'string') { | |
| return data | |
| } | |
| return data.latin1Slice(0, data.length) | |
| }, | |
| utf16le: (data, sourceEncoding) => { | |
| if (data.length === 0) { | |
| return '' | |
| } | |
| if (typeof data === 'string') { | |
| data = Buffer.from(data, sourceEncoding) | |
| } | |
| return data.ucs2Slice(0, data.length) | |
| }, | |
| base64: (data, sourceEncoding) => { | |
| if (data.length === 0) { | |
| return '' | |
| } | |
| if (typeof data === 'string') { | |
| data = Buffer.from(data, sourceEncoding) | |
| } | |
| return data.base64Slice(0, data.length) | |
| }, | |
| other: (data, sourceEncoding) => { | |
| if (data.length === 0) { | |
| return '' | |
| } | |
| if (typeof data === 'string') { | |
| data = Buffer.from(data, sourceEncoding) | |
| } | |
| if (textDecoders.has(this.toString())) { | |
| try { | |
| return textDecoders.get(this).decode(data) | |
| } catch {} | |
| } | |
| return typeof data === 'string' | |
| ? data | |
| : data.toString() | |
| } | |
| } | |
| function decodeText (text, sourceEncoding, destEncoding) { | |
| if (text) { | |
| return getDecoder(destEncoding)(text, sourceEncoding) | |
| } | |
| return text | |
| } | |
| module.exports = decodeText | |