【问题标题】:Assistance with porting from Multi-Byte to UNICODE in MFC协助在 MFC 中从多字节移植到 UNICODE
【发布时间】:2012-06-17 17:58:58
【问题描述】:

我还有 6 个月到 1 年的无聊时间。我正在开发一个包含超过 100 万行代码的程序(其中大部分是在 90 年代早期/中期编写的),并且已经决定它现在应该支持 UNICODE 构建。我研究并发现了许多最佳做法:

  • 使用许多 microsoft 和 C++ 方法的 _t 版本,例如 _stprintf_s() 代替 sprintf_s() 或 _tcsstr() 代替 strstr(),
  • 包装所有需要 TCHAR* 的编码字符串,如 _T("string") 或 _T('c'),
  • 将大多数 char* 替换为 LPTSTR,将大多数 const char* 替换为 LPCTSTR,将 char 替换为 TCHAR 如有必要,使用 CA2T() 和 CT2A() 在 char* 和 LPTSTR 之间进行转换,

我想知道是否有人编写了一个能够自动进行许多这些更改的脚本,因为他们可以节省我几个月的工作量。

【问题讨论】:

  • 我认为这是一个帮助:mihai-nita.net/2007/12/19/…
  • 如果是真正的升级,不再需要多字节,你应该跳过所有_t的东西,直接去wchar_t。大约 15 年前,_t_T 被设计为(临时)辅助工具。
  • _T("") 在定义 _UNICODE 时映射到 L""。使用TCHAR 和相关函数与wchar_t 和相关函数的唯一原因是如果您需要从相同的源代码生成ANSI 和UNICODE 构建。如果您需要维护 ANSI 支持,请使用 TCHAR 和相关的。如果您只打算使用完整的 UNICODE,请使用 wchar_t 和相关的。最好使用 Unicode 框架,例如 ICONV 或 ICU,因为 Unicode 很难正确处理。仅更改数据类型是不够的,有时您必须更改程序逻辑以解决 ANSI 和 UNICODE 工作方式的逻辑差异。
  • 是的,将 Windows API 调用更改为使用 UTF-16 很容易。但是您要更改文件格式以使用 UTF-16 吗?如果您依赖任何非 Microsoft 库,它们是否全部都支持 UTF-16?如果他们像您的产品一样落后于 Unicode 支持怎么办?例如,Zlib 直到 a StackOverflow user requested it 3 个月前才支持 wchar_t* 文件名。
  • 类似地,OpenSSL 在 Windows 上仍然完全不支持 Unicode 文件名。其他平台使用 Ansi 或 UTF-8 文件系统,因此 OpenSSL 可以使用基于 char* 的文件名来处理它们。但在 Windows 上,开源 Indy library(我正在研究)最终不得不编写自己的一组函数,这些函数基本上是 OpenSSL 代码的副本,但经过调整以使用基于 wchar_t* 的文件名来支持 UTF-16。

标签: c++ unicode mfc multibyte


【解决方案1】:

我认为this approach 完全符合您的情况。

将所有字符串保留为窄字符,像以前一样使用 sprintfstrstr,从始终假定为没有 BOM 的 UTF-8 的文本文件中读取和写入,等等...您需要更改的是您与系统的通信。现在假设字符串是 UTF-8,在调用 MFC 或 Windows 之前,即时转换为 UTF-16。

作为奖励,与 Microsoft 提倡的方法相比,您将更容易移植到非 Windows 平台。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 2013-03-06
    • 2011-01-14
    相关资源
    最近更新 更多