6

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

  • 字符串
  • 标准::字符串
  • 标准::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”))。

编程界有官方立场吗?当面对多种字符串类型时,通常使用什么作为标准的“内部”存储格式?

4

2 回答 2

7

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

注意 Microsoft 在此处建议:Working with Strings

Windows 原生支持 UI 元素、文件名等的 Unicode 字符串。Unicode 是首选的字符编码,因为它支持所有字符集和语言。Windows 使用 UTF-16 编码表示 Unicode 字符,其中每个字符都被编码为 16 位值。UTF-16 字符称为宽字符,以区别于 8 位 ANSI 字符。Visual C++ 编译器支持宽字符的内置数据类型 wchar_t

还:

当 Microsoft 将 Unicode 支持引入 Windows 时,它通过提供两组并行的 API 来简化过渡,一组用于 ANSI 字符串,另一组用于 Unicode 字符串。[...] 在内部,ANSI 版本将字符串转换为 Unicode。

还:

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

于 2017-08-31T14:46:49.303 回答
1

这取决于。

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

  • 资源(字符串、对话框等)
  • 文件系统访问(Windows 允许在文件和目录名称中使用非 ASCII 字符(包括所有“错误类型的撇号”顺便说一句),这些无法使用 ANSI API 打开)
  • COM(BSTR 总是宽字符)
  • 其他面向用户的界面(剪贴板、系统错误报告等)

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

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

“UTF-8 无处不在”通常是一个合理的想法。但是有0个采用 UTF-8 的 Windows API。甚至std::experimental::filesystemAPI 也用于std::wstringWindows 和std::stringPOSIX。

于 2017-08-31T15:26:05.363 回答