我应该从Windows代码中删除TCHAR吗?

时间:2011-06-11 11:16:51

标签: c winapi unicode utf-8 tchar

我正在修改一些非常古老的(10年)C代码。该代码在Unix / Mac上使用GCC进行编译,并使用MinGW对Windows进行交叉编译。目前整个都有TCHAR字符串。我想摆脱TCHAR并使用C ++字符串代替。是否仍然需要使用Windows范围的功能,或者我现在可以使用Unicode和UTF-8执行所有操作吗?

5 个答案:

答案 0 :(得分:9)

Windows仍然使用UTF16,而且很可能总是如此。因此,您需要使用wstring而不是string。 Windows API不直接提供对UTF8的支持,主要是因为Windows在UTF8发明之前支持Unicode。

编写将在Windows和Unix平台上编译的Unicode代码非常痛苦。

答案 1 :(得分:4)

  

是否仍然需要使用   Windows范围的功能,或者我可以做   现在一切都使用Unicode和UTF-8?

是。不幸的是,Windows没有UTF-8的原生支持。如果需要正确的Unicode支持,则需要使用wchar_t版本的Windows API函数,而不是char版本。

  

我应该从Windows代码中删除TCHAR吗?

是的,你应该。 TCHAR存在的原因是支持Unicode和非Unicode版本的Windows。 2001年,当Windows 98仍然流行时,非Unicode支持可能是一个主要问题,但今天却不是。

任何非特定于Windows的库都不太可能具有char / wchar_t重载,使TCHAR可用。

请继续使用TCHAR替换所有wchar_t

  

代码在Unix / Mac上使用GCC进行编译,并使用MinGW进行Windows的交叉编译。

之前我必须编写跨平台的C ++代码。 (现在我的工作是编写跨平台的C#代码。)当Windows不支持UTF-8且Un * x不支持UTF-16时,字符编码相当痛苦。我最终使用UTF-8作为我们的主要编码并在Windows上根据需要进行转换。

答案 2 :(得分:0)

是的,现在编写非unicode应用程序正在让自己陷入困境。只需在任何地方使用广泛的API,您不必在以后哭泣。如果你不需要平台之间的(网络)通信(或者将wchar_t与Win32 API转换为UTF-8),你仍然可以在UNIX上使用UTF8,在Windows上使用wchar_t,或者在任何地方使用UTF-8进行转换并转换使用Win32 API函数时wchar_t(这就是我的工作)。

答案 3 :(得分:0)

直接回答你的问题:

  

是否仍然需要使用Windows范围的功能,还是现在可以使用Unicode和UTF-8完成所有操作?

不,(非ASCII)绝大多数Windows API函数都不接受UTF-8。您仍然必须使用广泛的API。

人们可能同样哀叹其他操作系统仍然不支持wchar_t。所以你还必须支持UTF-8。

其他答案提供了一些关于如何在跨平台代码库中进行管理的好建议,但听起来好像您已经有一个支持不同字符类型的实现。如同简化代码可能听起来一样可取,但不要。

答案 4 :(得分:0)

我预测,有一天,虽然可能不会在2020年之前,Windows将添加UTF-8支持,只需添加所有API功能的U版本,A和W,以及相同类型的链接器黑客。 8位A函数只是原生W(UTF-16)函数的转换层。我打赌他们可以从A层半自动生成U层。

一旦他们被足够长的戏弄,关于他们'20世纪'的Unicode支持......

通过使用精心挑选的宏和默认的Visual Studio设置,他们仍然会设法使其难以编写,难以阅读和不可移植。