我该如何反转golang中的编码字节?

问题描述 投票:0回答:1

我使用以下功能将字节编码为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)

go utf-8 websocket flatbuffers
1个回答
0
投票

您提供的代码似乎已从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参数从Web套接字读取/写入。

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

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

来源:GoDoc

© www.soinside.com 2019 - 2024. All rights reserved.