WebSocket和文本编码

Ben*_*Ben 4 javascript websocket

我读:

WebSocket API接受一个DOMString对象,该对象在网络上被编码为UTF-8,或者接受ArrayBuffer,ArrayBufferView或Blob对象之一进行二进制传输。

A DOMString是UTF-16编码的字符串。那么在网上使用UTF-8编码是否正确?

Rem*_*eau 5

是的,这是正确的。

UTF-16可能会或可能不会在内存中使用,这只是您所使用的任何框架的实现细节。对于JavaScript,字符串为UTF-16。

对于WebSocket通信,必须通过有线方式将UTF-8用于文本数据(当今大多数Internet协议都使用UTF-8)。这是由WebSocket协议规范规定的

成功的握手之后,客户端和服务器以本规范中称为“消息”的概念单元来回传输数据。在线上,一条消息由一个或多个帧组成。WebSocket消息不一定与特定的网络层框架相对应,因为碎片消息可能会被中介合并或拆分。

框架具有关联的类型。属于同一消息的每个帧都包含相同类型的数据。广义上讲,存在文本数据(解释为UTF-8 [RFC3629]文本),二进制数据(其解释权留给应用程序)和控制帧(不打算为应用程序携带数据)的类型。而是用于协议级别的信令,例如表示应该关闭连接。该协议的该版本定义了六种帧类型,并保留了十种以供将来使用。

...

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

数据帧承载应用层和/或扩展层数据。操作码确定数据的解释:

文本

“有效载荷数据”是编码为UTF-8的文本数据。请注意,特定的文本框架可能包括部分UTF-8序列。但是,整个消息必须包含有效的UTF-8。如第8.1节所述,处理了重组消息中的无效UTF-8。

二元

“有效载荷数据”是任意二进制数据,其解释仅取决于应用程序层。

您将确保从UTF-16到UTF-8再到UTF-16的少量开销,但是在现代机器上开销很小,并且UTF之间的转换是无损的。