发送平面缓冲区的字节时,浏览器Websocket发出“无法将文本帧解码为UTF-8”

时间:2019-11-22 04:28:36

标签: go utf-8 websocket flatbuffers

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

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

如何将strByte转换为原点?

详细信息

原始字节来自flatbuffers的builder.FinishedBytes() 并且我必须将其转换为utf-8字节以用于websocket连接中(因为浏览器发出失败之类的错误:无法将文本框架解码为UTF-8)

1 个答案:

答案 0 :(得分:3)

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

  

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

您不是在检查返回的错误,而是解码任意二进制文件,就像它是UTF-8编码的文本一样,肯定会产生错误。

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

  

数据帧(例如非控制帧)由操作码标识      其中操作码的最高有效位为0。当前定义      数据帧的操作码包括0x1(文本),0x2(二进制)。操作码      0x3-0x7保留用于尚待处理的其他非控制帧      定义。

来源:RFC 6455

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

  

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

     

此程序包使用TextMessage和BinaryMessage整数常量来标识两种数据消息类型。 ReadMessage和NextReader方法返回接收到的消息的类型。 WriteMessage和NextWriter方法的messageType参数指定已发送消息的类型。

来源:GoDoc