浏览器 websocket 在发送扁平缓冲区的字节时发出"Could not decode a text frame as UTF-8"



我使用以下函数将字节编码为 utf-8

func convrtToUTF8(origin []byte) []byte {
    byteReader := bytes.NewReader(origin)
    reader, _ := charset.NewReaderLabel("utf-8", byteReader)
    strBytes, _ = ioutil.ReadAll(reader)
    return strBytes
}

如何将 strByte 转换为原点?

Origin Bytes来自Flatbuffers的Builder。DoneBytes(( 我必须将其转换为 utf-8 字节才能在 websocket 连接中使用(因为浏览器发出错误,例如失败:无法将文本框架解码为 UTF-8(

您提供的代码似乎从 UTF-8 转换为 UTF-8:

NewReaderLabel 返回一个读取器,该读取器从指定的字符集转换为 UTF-8。它使用 Lookup 查找与 label 对应的编码,如果 Lookup 返回 nil,则返回错误。 来源: GoDoc

您不是在检查返回的错误,但是将任意二进制解码为UTF-8编码的文本肯定会产生错误。

更重要的是,您要发送二进制数据,不要像文本一样将其编码为 UTF-8。要通过 websocket 发送,请将数据保留为二进制:

数据帧(例如,非控制帧(由操作码标识 其中操作码的最高有效位为 0。 当前定义 数据框的操作码包括0x1(文本(、0x2(二进制(。 操作码 0x3-0x7保留给尚未确定的更多非控制帧 定义。

来源: RFC 6455

例如,如果您使用的是 github.com/gorilla/websocket ,则应使用 messageType 参数的BinaryMessage从 websocket 读取/写入。

WebSocket 协议区分文本和二进制数据消息。文本消息被解释为 UTF-8 编码的文本。二进制消息的解释留给应用程序。

此包使用文本消息和二进制消息整数常量来标识两种数据消息类型。ReadMessage 和 NextReader 方法返回收到的消息的类型。WriteMessage 和 NextWriter 方法的 messageType 参数指定已发送消息的类型。

来源: GoDoc

相关内容

最新更新