He escrito el código a continuación para ilustrar este comportamiento que ocurre cuando se combinan estas dos cadenas.
const getBytes = x => { let buf = Buffer.from(x); const n = []; for (const value of buf.values()) { n.push(value); } return [n, parseInt(buf.toString('hex'), 16)]; }; let x = unescape('%uDB40'); let y = unescape('%uDD31'); console.log(typeof(x), typeof(y)); console.log(Buffer.from(x), getBytes(x), ); console.log(Buffer.from(y), getBytes(y)); console.log(Buffer.from(x+y), getBytes(x+y));El resultado es:
string string <Buffer ef bf bd> [ [ 239, 191, 189 ], 15712189 ] <Buffer ef bf bd> [ [ 239, 191, 189 ], 15712189 ] <Buffer f3 a0 84 b1> [ [ 243, 160, 132, 177 ], 4087383217 ]No puedo entender cómo termina como un resultado completamente diferente que me impide portar este comportamiento con éxito.
Como dice la documentación de Buffer.from : "Al convertir entre búferes y cadenas, se puede especificar una codificación de caracteres. Si no se especifica ninguna codificación de caracteres, se utilizará UTF-8 como valor predeterminado".
Para convertir de una cadena de JavaScript (UTF-16) a un búfer (UTF-8), escribió:
let buf = Buffer.from(x);Si falla una conversión de caracteres UTF-16 a UTF-8, escribe el carácter de reemplazo Unicode en Buffer, según lo prescrito por el estándar Unicode.
Usé estos enlaces para responder a su pregunta: Node.js: Buffer , U+DB40 , U+DD31 , U+FFFD , U+E0131 .
Para una referencia de JavaScript: JavaScript: The Definitive Guide, por David Flanagan .
Para una referencia Unicode: Estándar Unicode .