以UTF-8字符串存储二进制数据

时间:2010-10-18 06:14:59

标签: javascript unicode utf-8 websocket

我想使用WebSocket传输二进制数据,但您只能使用WebSockets传输UTF-8字符串。

使用base64对其进行编码是一种选择,但我的理解是,当您的文本可能从一种格式转换为另一种格式时,最理想的是base64。在这种情况下,我知道数据将始终是UTF-8,那么是否有更好的方法来编码UTF-8字符串中的二进制数据而不支付base64的33%大小溢价?

这个问题主要是学术性的,因为二进制支持最终可能会被添加到WebSocket中,而base64在此期间是一个完美的替代方案。

3 个答案:

答案 0 :(得分:13)

您可以使用Base-128编码而不是Base-64编码。这只会导致1/3的开销与1/3相反。

我们的想法是使用所有可以在UTF-8(0-127)的单个字节中表示的Unicode代码点。这意味着所有字节都以0开头,因此数据还剩下7位:

0‍xxxxxxx

这导致编码使用8个输出字节编码7个输入字节:

input:  aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffff gggggggg
output: 0aaaaaaa 0abbbbbb 0bbccccc 0cccdddd 0ddddeee 0eeeeeff 0ffffffg 0ggggggg

因此输出与输入比率为8/7。

答案 1 :(得分:0)

当字符串不支持二进制blob时以及文本编码可能发生变化时,最好使用Base64 - 通常,Base64中使用的字符在所有字符集中都是安全的(已经存在了很长时间)。

如果你知道它总是UTF8,你能否以一种利用数千个UTF8字符的方式对其进行编码?

答案 2 :(得分:0)

您也可以使用Base-91。最坏情况下的开销为23%。 Base-128有1/7 = 14%。

相关问题