C/C++ 中的跨平台通用文本处理
Posted
技术标签:
【中文标题】C/C++ 中的跨平台通用文本处理【英文标题】:Cross-Platform Generic Text Processing in C/C++ 【发布时间】:2009-04-16 00:42:46 【问题描述】:目前以独立于平台的方式处理通用文本的最佳做法是什么?
例如,在 Windows 上,有“A”和“W”版本的 API。在 C 层,我们有映射到“wcscpy”或“strcpy”的“_tcs”函数(如 _tcscpy)。在 STL 中,我经常使用类似的东西:
typedef std::basic_string<TCHAR> tstring;
如果在其他系统上出现此类模式会出现什么问题?
【问题讨论】:
能否将标题更改为“文本处理”。由于“通用文本”使它有点不清楚。顺便说一句,文本数据始终是通用且独立于平台的。 【参考方案1】:在标准 C++ 中不支持像 TCHAR
这样的通用(可变宽度)字符。 C++ 确实有wchar_t
,但不能保证编码。一旦我们有了 char16_t
和 char32_t
以及 UTF-8,16,32 文字,C++1x 将大大改善。
我个人不是通用字符的忠实拥护者,因为它们会导致一些令人讨厌的问题(例如转换),此外,如果您使用的类型(例如 TCHAR
)可能最大宽度为 8 ,您不妨使用char
编码。如果您真的需要向后兼容,只需使用 UTF-8;它专门设计为 ASCII 的严格超集。您可能必须使用转换 API(尤其是在 Windows 上,因为某些奇怪的原因是 UTF-16),但至少它会是一致的。
编辑:要真正回答原始问题,其他平台通常没有这样的结构。您必须在该平台上定义您的 TCHAR,或者使用提供 TCHAR 的库(但毫无疑问,您应该能够猜到,我也不是库中该概念的忠实粉丝)。
【讨论】:
【参考方案2】:要注意的一件事是确保您拥有的所有静态库以及使用这些静态库的模块都使用相同的 char 格式。因为否则您的代码将编译,但无法正确链接。
我通常基于 stl 类型创建自己的 t
类型。 tstring, tstringstream, 甚至到 boost 类型,比如 tpath_t。
【讨论】:
【参考方案3】:Unicode 字符集 + 对您的数据最有意义的编码。我通常使用 UTF-8,因为它与传统的 C/C++ 函数一起使用很方便,而且我处理的数据不会造成太大的膨胀。
一些 API (Windows) 和跨语言工具 (Java) 使用 UTF-16,因此这可能是一个考虑因素。
我希望我们做得更好的一种做法是将文本保留为数组字节,以进行复制、简单比较、简单搜索等低技术操作。当您需要更丰富的字符感知操作时,您可以转换为一些超级字符串(icu strings 很好 - 但很重)并定义需要执行此操作的层/入口点,而不是在任何地方天真地执行此操作。不必要的对话会扼杀我们的表现——尤其是与同样使用“超级”字符串的 XML DOM 库结合使用时。
【讨论】:
以上是关于C/C++ 中的跨平台通用文本处理的主要内容,如果未能解决你的问题,请参考以下文章