我应该使用 UTF-8 通过网络发送数据吗?

Posted

技术标签:

【中文标题】我应该使用 UTF-8 通过网络发送数据吗?【英文标题】:Should I use UTF-8 to send data over the network? 【发布时间】:2015-03-20 04:12:02 【问题描述】:

WinAPI 使用 UTF-16LE 编码,所以如果我调用一些返回字符串的 WinAPI 函数,它将以 UTF-16LE 编码返回。

所以我正在考虑在我的程序中对字符串使用 UTF-16LE 编码,当需要通过网络发送数据时,我将其转换为 UTF-8,另一方面我将其转换回UTF-16LE。这样可以减少要发送的数据量。

我有理由不这样做吗?

【问题讨论】:

这是你的程序,它可以做任何你想做的事情:) 我可能会考虑 UTF-8,因为它在与 3rd 方应用程序接口方面很受欢迎,但除非您发送真正大量的文本,否则我认为它不太可能占用带宽。跨度> 您要问的是大多数现代 Internet 协议的工作原理。本机编码用于内存中的字符串,通过网络发送时转换为/从 UTF-8 转换,以减少带宽并支持跨平台兼容性。 【参考方案1】:

使用UTF-8 编码,您将使用:

1 个字节用于 ASCII 字符 U+0000 和 U+07FF 之间的 unicode 字符为 2 个字节 如果需要,更多字节

因此,如果您的文本是西方语言,在大多数情况下,它在 UTF-8 中可能会比在 UTF-16LE 编码中更短:西方字母是 encoded between U-0000 and U-0590。

相反,如果您的文本是亚洲文本,那么 UTF8 编码可能会显着增加您的数据。亚洲字符集超过 U+7FF,因此至少需要 3 个字节

在UTF8 everywhere article 中,您可以找到有关文本编码长度的一些(基本)统计信息,以及支持使用 UTF8 的其他参数。

我想到的网络是 UTF8 表示在所有平台上都是相同的表示,而对于 UTF16,您有 LE 和 BE,具体取决于操作系统和 CPU 架构。

【讨论】:

以上是关于我应该使用 UTF-8 通过网络发送数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

检查使用 bCrypt 加密的密码 .. 我需要通过网络发送密码吗?

Android 连接时在后台发送数据

如果输入违反了我的约定,我应该发送 400 错误吗?

通过 HTTP 在 javascript 中发送二进制数据

如何编写 http 隧道

有人可以推荐一个好的客户端库来通过 https 发送数据吗? [关闭]