如何在JavaScript中实现与Java String.getBytes(UTF_8)等效的功能?
核心原因
你得到的[194, 160]和Java输出的[-62, -96]二进制完全一致,差异仅来自类型定义:
- Java的
byte是8位有符号整数,取值范围为-128 ~ 127 - JS中Uint8Array是8位无符号整数,取值范围为
0 ~ 255
194减256等于-62,160减256等于-96,只需要加一步无符号转有符号的操作即可得到和Java完全一致的结果。
解决方案
推荐使用标准TextEncoder实现,代码更简洁且性能更优:
function getJavaUtf8Bytes(str) { const unsignedBytes = new TextEncoder().encode(str); const javaBytes = []; for (const b of unsignedBytes) { javaBytes.push(b > 127 ? b - 256 : b); } return javaBytes; } // 测试 console.log(getJavaUtf8Bytes("\u00A0")); // 输出:[-62, -96]
如果要使用你之前手动实现的strToUtf8Bytes函数,只需要在返回结果前统一做一次转换即可:
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++; 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), ); } } // 新增转换逻辑:无符号转有符号8位整数 return utf8.map(b => b > 127 ? b - 256 : b); }
转换后的数组所有元素都在Java byte类型的合法取值范围内,直接传递给Graal JS调用的Java方法即可,不会触发范围错误。
内容的提问来源于stack exchange,提问作者rmf
相关产品推荐
相关产品推荐

