【发布时间】: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。