UTF-8的问题在于它不是最节省空间的编码 . 此外,一些随机二进制字节序列是无效的UTF-8编码 . 因此,您不能将随机二进制字节序列解释为某些UTF-8数据,因为它将是无效的UTF-8编码 . 这种对UTF-8编码的约束的好处在于它使得它很可靠并且可以定位多字节字符开始和结束我们开始查看的任何字节 .
因此,如果在[0..127]范围内编码字节值只需要UTF-8编码中的一个字节,则编码[128..255]范围内的字节值将需要2个字节!比那更糟糕 . 在JSON中,控制字符“和\”不允许出现在字符串中 . 因此二进制数据需要进行一些转换才能正确编码 .
让我们看看 . 如果我们在二进制数据中假设均匀分布的随机字节值,那么平均来说,一半字节将在一个字节中编码,另一半在两个字节中编码 . UTF-8编码的二进制数据将具有初始大小的150% .
Base64编码仅增长到初始大小的133% . 所以Base64编码效率更高 .
那么使用其他Base编码呢?在UTF-8中,对128个ASCII值进行编码是最节省空间的 . 在8位中,您可以存储7位 . 因此,如果我们以7位块的形式剪切二进制数据以将它们存储在UTF-8编码字符串的每个字节中,则编码数据将仅增长到初始大小的114% . 比Base64好 . 不幸的是,我们不能使用这个简单的技巧,因为JSON不允许一些ASCII字符 . ASCII([0..31]和127)的33个控制字符和“和\”必须被排除 . 这使得我们只有128-35 = 93个字符 .
因此理论上我们可以定义一个Base93编码,它将编码大小增加到8 / log2(93)= 8 * log10(2)/ log10(93)= 122% . 但Base93编码不如Base64编码方便 . Base64需要以6位块的形式剪切输入字节序列,以便简单的按位运算 . 除133%外,不超过122% .
这就是我独立得出的结论,即Base64确实是用JSON编码二进制数据的最佳选择 . 我的回答是一个为它辩护 . 我同意从性能的角度来看它并不是很有吸引力,但也要考虑使用JSON的好处,它的人类可读字符串表示易于在所有编程语言中操作 .
如果性能至关重要,则应将纯二进制编码视为JSON的替代 . 但是对于JSON,我的结论是Base64是最好的 .