【发布时间】:2018-02-09 12:54:15
【问题描述】:
我正在对一个大型的遗留 MFC 代码库进行现代化改造,其中包含真正的字符串类型混合体:
- CString
- std::string
- std::wstring
- 字符*
- wchar_t*
- _bstr_t
我想在内部标准化单个字符串类型,仅在第三方 API(即 COM 或 MFC 函数)绝对需要时转换为其他类型。我和我的同事正在辩论的问题;我们应该标准化哪种字符串类型?
我更喜欢 C++ 标准字符串之一:std::string 或 std::wstring。我个人倾向于 std::string,因为我们不需要宽字符——它是一个内部代码库,没有面向客户的 UI(即不需要多语言支持)。 “普通”字符串允许我们使用简单、朴素的字符串文字(“Hello world”与 L“Hello world”或 _T(“Hello world”))。
编程社区有官方立场吗?当面对多种字符串类型时,通常使用什么作为标准的“内部”存储格式?
【问题讨论】:
-
Windows 内部是 UTF-16LE,所以
std::wstring非常适合该平台;std::vector<wchar_t>也是如此。 -
对于 Windows 应用程序,请使用
std::wstring。使用窄字符串,您需要到处进行转换。注意:由于您还不知道这一点,因此您不是做这项工作的好选择,这是基础知识。这个选择是你的经理的错。 -
Re
_T("Hello world"),T宏在 2000 年因 Unicode 层的引入而被淘汰,今天我们的工具无法为这些 Windows 版本 (9x) 生成可执行文件宏目标。我知道这是一个遗留代码库。但是当你的任务是清理时,提到T宏是很荒谬的,而且会适得其反。 -
如果您选择窄字符,那么您只需要一名非拉丁名字的员工就可以破坏您的程序,并且您遇到了用户及以下目录的编码问题。
-
@BTownTKD;您的声明“Windows 为几乎所有 API 提供窄字符替代方案”是基于完全无知。窄函数执行与 Windows ANSI 之间的转换,这是 (1) 系统特定的,并且 (2) 无法表示例如所有文件系统路径。此外,许多 API,尤其是较新的 API,没有 ANSI 包装器。
标签: c++ string mfc com widestring