WebSockets和文本编码

时间:2017-04-20 20:13:02

标签: javascript websocket

我看了:

  

WebSocket API接受DOMString对象,该对象编码为   线上的UTF-8,或ArrayBuffer,ArrayBufferView或Blob之一   二进制传输的对象。

DOMString是UTF-16编码的字符串。因此,通过线路使用UTF-8编码是否正确?

1 个答案:

答案 0 :(得分:4)

是的,这是正确的。

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

对于WebSocket通信,UTF-8必须通过线路用于文本数据(大多数Internet协议现在使用UTF-8)。这由WebSocket protocol specification

决定
  

成功握手后,客户端和服务器以本规范中提到的概念单位来回传输数据" message"。在线上,消息由一个或多个帧组成。 WebSocket消息不一定对应于特定的网络层框架,因为碎片消息可能由中间人合并或拆分。

     

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

     

...

     

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

     

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

     

文本

     

"有效负载数据"是编码为UTF-8 的文本数据。注意,特定文本框架可能包括部分UTF-8序列;但是,整个消息必须包含有效的UTF-8 。重新组装的消息中的无效UTF-8按第8.1节中的描述进行处理。

     

二进制

     

"有效载荷数据"是任意二进制数据,其解释完全取决于应用层。

您将会产生少量的开销,从UTF-16转换为UTF-8到UTF-16,但现代机器上的开销很小,而且UTF之间的转换是无损的。