You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:54:03