关于跨平台Unicode字符串使用的主题有无数的讨论线程,但似乎有广泛的意见,没有解决一些在我正在从事的特定项目中一直困扰我的具体问题:
我有一个可以追溯到近 20 年的大型跨平台 C++ 代码库。它包含各种字符串实现方式的大杂烩,包括:
char*
- 帕斯卡风格的字符串
std::string
- 几个具有重叠功能的自定义跨平台类
CFString
- 各种常量字符串
该代码库正在重写以完全使用 Unicode 字符串并实现强大的 MVC 架构,希望该模型将完全可移植(Mac OS / IOS / Android / Windows 7 & 8 / Unix)。
虽然持久性数据被编写为 XML/UTF-8,但在运行时对象中的字符串使用方面存在一些困境:
我想创建一个干净地隐藏存储、分配和常见字符串操作的实现的类。通过 C++ 运算符和赋值重载的奇迹,我希望能够替换一个类实例来替换函数可以接受的所有不同的字符串参数。这将允许代码库的增量转换。
我们一直在扫描/解析/分析字符串,我担心对持久对象使用严格的 UTF-8 底层实现可能会出现性能问题。如果不是,那么在微软的 VC++ 和 GNU 的 G++ 中发现的现代 std::string 会是一个简单的底层实现吗?
Mac OS / IOS 版本最终需要将其字符串“转换”为 CFString。CF 功能丰富且高度优化。我认为通过为 CF 提供缓冲区(例如,
CFStringCreateWithCharactersNoCopy
或CFStringCreateMutableWithExternalCharactersNoCopy
)让我自己的类创建 CFStrings 将是一个很好的策略。似乎这可以减少从模型中获取数据后 CFString 通常需要的转换/分配量——尽管可能在适当的 MVC 实现中,控制器/视图不应该访问模型拥有的实际字符串?C++ 11 是否会改变这些跨平台字符串问题的情况?
我猜想这些问题早就应该解决了——但是从查看本网站(和其他网站)上的回复来看,我看不出它已经解决了。