【问题标题】:WebSockets and text encodingWebSockets 和文本编码
【发布时间】:2017-09-17 15:34:26
【问题描述】:

我读到了:

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

DOMString 是一个 UTF-16 编码的字符串。那么通过网络使用 UTF-8 编码是否正确?

【问题讨论】:

    标签: javascript websocket


    【解决方案1】:

    是的,没错。

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

    对于 WebSocket 通信,必须通过网络使用 UTF-8 来传输文本数据(现在大多数 Internet 协议都使用 UTF-8)。这是由WebSocket protocol specification 决定的:

    成功握手后,客户端和服务器在本规范中称为“消息”的概念单元中来回传输数据。在网络上,一条消息由一个或多个帧组成。 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 之间的转换是无损的。

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      相关资源
      最近更新 更多