C++中的跨平台字符串(和Unicode)

use*_*380 12 c++ string unicode cross-platform wchar-t

所以我终于回到了我的主要任务 - 将一个相当大的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.

asc*_*ler 8

当涉及文件或网络连接时,始终使用为字节定义的协议.不要依赖C++编译器如何在内存中存储任何内容.对于Unicode文本,这意味着选择编码和字节顺序(好吧,UTF-8不关心字节顺序).即使您当前想要支持的平台具有类似的架构,也可能会出现另一个具有不同行为的流行平台,甚至是现有平台的新操作系统,您会很高兴编写可移植代码.