【发布时间】:2017-09-17 15:34:26
【问题描述】:
我读到了:
WebSocket API 接受一个 DOMString 对象,该对象被编码为 线上的 UTF-8,或 ArrayBuffer、ArrayBufferView 或 Blob 之一 二进制传输的对象。
DOMString 是一个 UTF-16 编码的字符串。那么通过网络使用 UTF-8 编码是否正确?
【问题讨论】:
标签: javascript websocket
我读到了:
WebSocket API 接受一个 DOMString 对象,该对象被编码为 线上的 UTF-8,或 ArrayBuffer、ArrayBufferView 或 Blob 之一 二进制传输的对象。
DOMString 是一个 UTF-16 编码的字符串。那么通过网络使用 UTF-8 编码是否正确?
【问题讨论】:
标签: javascript websocket
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 之间的转换是无损的。
【讨论】: