我们何时应该喜欢宽字符



我正在现代化一个大型旧的MFC代码库,其中包含一个名副其实的字符串类型混合物:

  • cstring
  • std :: string
  • std :: Wstring
  • char*
  • WCHAR_T*
  • _BSTR_T

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

我更喜欢C 标准字符串之一:STD :: String或STD :: Wstring。我个人倾向于STD :: String,因为我们不需要宽字符 - 它是一个没有面向客户UI的内部代码库(即无需多语言支持)。"纯"字符串允许我们使用简单的,未修饰的字符串文字(" Hello World" vs L" Hello World"或_t(" Hello world"))。

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

如果我们谈论Windows,请使用STD :: WSTRING(因为我们通常需要酷字符串功能)或WCHAR_T*,如果您只通过围绕着字符串。

注意Microsoft建议在这里:使用字符串

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

也:

当微软对Windows引入Unicode支持时,它放松了 通过提供两个平行的API来过渡,一个用于ANSI 字符串,另一个用于Unicode字符串。[...]在内部,ANSI 版本将字符串转换为Unicode。

也:

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

它取决于。

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

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

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

问题中可能还没有提及其他方面,例如所使用的数据库或API,输入/输出文件等及其charsets-所有这些在决定最佳数据结构的最佳数据结构时都起着作用。工作。

"无处不在的UTF-8"是一个合理的想法。但是有 0 Windows API服用UTF-8。甚至std::experimental::filesystem API都在Windows上使用std::wstring,在POSIX上使用std::string

最新更新