Tengo el siguiente código Java:
String str = "\u00A0"; byte[] bytes = str.getBytes(StandardCharsets.UTF_8); System.out.println(Arrays.toString(bytes));Esto genera la siguiente matriz de bytes:
[-62, -96]Estoy tratando de obtener el mismo resultado en Javascript. He probado la solución publicada aquí:
https://stackoverflow.com/a/51904484/12177456
function strToUtf8Bytes(str) { const utf8 = []; for (let ii = 0; ii < str.length; ii++) { let charCode = str.charCodeAt(ii); if (charCode < 0x80) utf8.push(charCode); else if (charCode < 0x800) { utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f)); } else if (charCode < 0xd800 || charCode >= 0xe000) { utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f)); } else { ii++; // Surrogate pair: // UTF-16 encodes 0x10000-0x10FFFF by subtracting 0x10000 and // splitting the 20 bits of 0x0-0xFFFFF into two halves charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (str.charCodeAt(ii) & 0x3ff)); utf8.push( 0xf0 | (charCode >> 18), 0x80 | ((charCode >> 12) & 0x3f), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f), ); } } return utf8; } console.log(strToUtf8Bytes("h\u00A0i"));Pero esto da esto (que es un https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array ):
[194, 160] Esto es un problema para mí, ya que estoy usando el motor graal js y necesito pasar la matriz a una función java que espera un byte[] , por lo que cualquier valor en la matriz > 127 generará un error, como se describe aquí:
https://github.com/oracle/graal/issues/2118
Tenga en cuenta que también probé la clase TextEncoder en lugar de la función strToUtf8Bytes como se describe aquí:
java string.getBytes("UTF-8") equivalente de javascript
pero da el mismo resultado que el anterior.
¿Hay algo más que pueda probar aquí para que pueda obtener JavaScript para generar la misma matriz que Java?
El resultado es el mismo en términos de bytes, JS solo tiene como valor predeterminado bytes sin firmar . U en Uint8Array significa "sin firmar"; la variante firmada se llama Int8Array .
La conversión es fácil: simplemente pase el resultado al constructor Int8Array :
console.log(new Int8Array(new TextEncoder().encode("\u00a0"))); // Int8Array [ -62, -96 ]