我们什么时候应该选择宽字符串呢?

时间:2017-08-31 14:12:33

标签: c++ string mfc com widestring

我正在对一个庞大的传统MFC代码库进行现代化改造,其中包含一个名副其实的字符串类型:

  • CString的
  • 的std :: string
  • 的std :: wstring的
  • 字符*
  • wchar_t的*
  • _bstr_t

我希望在内部对单个字符串类型进行标准化,并且仅在第三方API(即COM或MFC函数)绝对需要时转换为其他类型。我的同事和我正在辩论的问题;我们应该标准化哪种字符串类型?

我更喜欢C ++标准字符串之一:std :: string或std :: wstring。我个人倾向于std :: string,因为我们不需要宽字符 - 它是一个内部代码库,没有面向客户的UI(即不需要多语言支持)。 "平原"字符串允许我们使用简单,朴实的字符串文字(" Hello world" vs L" Hello world"或_T(" Hello world"))。

编程社区是否有官方立场?当面对多种字符串类型时,通常用作标准内部'存储格式?

2 个答案:

答案 0 :(得分:6)

如果我们谈论Windows,我会使用std :: wstring(因为我们经常需要很酷的字符串功能),或者如果你只是传递字符串,那就是wchar_t *。

注意Microsoft建议:Working with Strings

  

Windows本身支持UI元素的Unicode字符串,文件名,   等等。 Unicode是首选的字符编码,因为它   支持所有字符集和语言。 Windows代表Unicode   使用UTF-16编码的字符,其中每个字符都被编码   作为16位值。 UTF-16字符称为宽字符   将它们与8位ANSI字符区分开来。 Visual C ++编译器   支持宽字符的内置数据类型wchar_t

此外:

  

当微软向Windows引入了Unicode支持时,它简化了   通过提供两组并行的API进行转换,一组用于ANSI   字符串和另一个Unicode字符串。 [...]在内部,ANSI   version将字符串转换为Unicode。

此外:

  

新应用程序应始终调用Unicode版本。很多世界   语言需要Unicode。如果您使用ANSI字符串,它将是   无法本地化您的应用程序。 ANSI版本也是   效率较低,因为操作系统必须转换ANSI   在运行时将字符串转换为Unicode。 [...] Windows中的大多数新API都有   只是一个Unicode版本,没有相应的ANSI版本。

答案 1 :(得分:1)

取决于。

在为Windows编程时,我建议至少使用std::wstring

  • 资源(字符串,对话等)
  • 文件系统访问(Windows允许文件和目录名称中的非ASCII字符(包括所有"错误类型的撇号" btw),这些都不可能使用ANSI API打开)
  • COM(BSTR总是宽字符)
  • 其他面向用户的界面(剪贴板,系统错误报告等)

但是,使用单字符字符串处理内部ASCII数据文件 UTF-8编码数据更容易。它快速,高效,直接。

在问题中可能还有其他一些方面,例如使用的数据库或API,输入/输出文件等及其字符集 - 所有这些都在决定最佳数据结构时发挥作用工作

"到处都是UTF-8"总的来说是一个好主意。但是 0 Windows API采用UTF-8。即使std::experimental::filesystem API在Windows上使用std::wstring,在POSIX上使用std::string