所以我终于回到了我的主要任务——将一个相当大的 C++ 项目从 Windows 移植到 Mac。
我马上就遇到了 wchar_t 在 Windows 上是 16 位但在 Mac 上是 32 位的问题。这是一个问题,因为所有的字符串都由 wchar_t 表示,并且会有字符串数据在 Windows 和 Mac 机器之间来回传输(以磁盘数据和网络数据形式)。由于它的工作方式,在发送和接收数据之前将字符串转换为某种通用格式并不完全简单。
我们最近也真正开始支持更多的语言,因此我们开始处理大量的 Unicode 数据(以及处理从右到左的语言)。
现在,我可能会在这里混淆多个想法,给自己带来比需要更多的问题,这就是我问这个问题的原因。我们认为将所有内存中的字符串数据存储为 UTF-8 是很有意义的。它解决了 wchar_t 大小不同的问题,这意味着我们可以轻松支持多种语言,并且还大大减少了我们的内存占用(我们加载了很多 - 主要是英语 - 字符串) - 但似乎没有很多人在做这个。我们缺少什么吗?您必须处理一个明显的问题,即字符串长度可能小于存储该字符串数据的内存大小。
还是使用 UTF-16 是一个更好的主意?还是我们应该坚持使用 wchar_t 并编写代码在 wchar_t 和 Unicode 之间进行转换,在我们读/写磁盘或网络的地方?
我意识到这很危险地接近征求意见 - 但我们很担心我们忽略了一些明显的东西,因为它似乎没有很多 Unicode 字符串类(例如) - 但是有很多代码可以转换为/来自 Unicode,例如 boost::locale、iconv、utf-cpp 和 ICU。