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

如何通过WebRTC数据通道在Java与JS间传输ISO-8859-1编码字节数组

解决ISO-8859-1字节数组通过WebRTC DataChannel传输的问题

你的核心问题是直接将ISO-8859-1字节数组转UTF-8字符串时,会破坏原始数据(因为ISO-8859-1的部分字节不属于合法UTF-8序列,会被替换为无效字符)。正确的做法是用Base64编码中转,确保字节数据无损失传输。

修正后的Java代码

import java.util.Base64;
import java.nio.charset.StandardCharsets;
import java.nio.ByteBuffer;

public void sendDataChannelMessage(byte[] message, DataChannel dataChannel) {
    if (dataChannel == null) {
        Log.e(TAG, "datachannel is null");
        return;
    }

    // 将原始ISO-8859-1字节数组转成Base64字符串
    String base64Data = Base64.getEncoder().encodeToString(message);
    // 将Base64字符串转成UTF-8字节(WebRTC传输字符串本质是传UTF-8字节)
    byte[] utf8Bytes = base64Data.getBytes(StandardCharsets.UTF_8);
    DataChannel.Buffer buffer = new DataChannel.Buffer(ByteBuffer.wrap(utf8Bytes), false);
    boolean ret = dataChannel.send(buffer);
    // Log.d(TAG, "send state: " + ret);
}

修正后的JavaScript代码

function handleReceiveMessage(event) {
    // 接收到Base64字符串,解码成原始字节数组
    const byteArray = Uint8Array.from(atob(event.data), c => c.charCodeAt(0));
    // 将原始字节数组用ISO-8859-1解码成文本
    const receivedData = new TextDecoder('iso-8859-1').decode(byteArray);
    // 如果需要原始字节数组,直接使用byteArray即可
}

原理说明

  • Base64编码可以将任意字节数组转换为纯ASCII字符串,完全避免编码转换带来的数据丢失问题,适合跨平台传输二进制数据。
  • Java端先把原始ISO-8859-1字节转Base64字符串,再以UTF-8编码发送(因为Base64字符都在UTF-8的兼容范围内,转码不会丢失信息)。
  • JS端先将Base64字符串解码回原始字节数组,再用ISO-8859-1解码器还原成文本,完全匹配原始数据。

内容的提问来源于stack exchange,提问作者xuyan Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:55:06