En el nodo v16.14.2,
> String.fromCharCode.apply(null, Buffer.from('°')) '°'Aunque esto funciona bien:
> Buffer.from('°').toString('utf-8') '°'Quiero saber por qué el primer escenario agrega un carácter adicional en la salida.
Ejemplo de navegador:
console.log(String.fromCharCode.apply(null, ethereumjs.Buffer.Buffer.from('°'))) /// '°' console.log(ethereumjs.Buffer.Buffer.from('°').toString('utf-8')) // '°' console.log(new Uint8Array(ethereumjs.Buffer.Buffer.from('°'))) // [ 194, 176 ] console.log(new Uint8Array(ethereumjs.Buffer.Buffer.from(String.fromCharCode(176)))) // [ 194, 176 ] <script src="https://cdn.jsdelivr.net/gh/ethereumjs/browser-builds/dist/ethereumjs-tx/ethereumjs-tx-1.3.3.min.js"></script>EDITAR : Otra cosa divertida:
> new Uint8Array(Buffer.from('°')) Uint8Array(2) [ 194, 176 ] > new Uint8Array(Buffer.from(String.fromCharCode(176))) Uint8Array(2) [ 194, 176 ]La codificación de cadena predeterminada de Buffer.from es UTF-8, que codifica caracteres en el rango ASCII extendido usando dos bytes. (No puede usar solo un byte porque el bit de orden más alto de ese byte se usa para señalar la codificación multibyte).
La codificación de dos bytes UTF-8 tiene la forma:
110xxxxx 10xxxxxx
que da 11 bits para representar un código de carácter.
El código ASCII de '°' es 176
> '°'.charCodeAt(0) 176que en binario es:
> (176).toString(2) '10110000'Entonces reemplazando la x con este valor binario tenemos:
110xxxxx 10xxxxxx 110xxx10 10110000 ^^ ^^^^^^ lo que significa que la codificación de dos bytes UTF-8 de '°' es
11000010 10110000
o
194 176
como se esperaba:
> [...Buffer.from('°')] [ 194, 176 ] > String.fromCharCode(194) 'Â' > String.fromCharCode(176) '°'