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

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

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

因此编写将在Windows和Unix平台上编译的Unicode代码是相当痛苦的。

是否仍然需要使用Windows范围的function,或者我现在可以使用Unicode和UTF-8完成所有操作吗?

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

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

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

并且,任何非Windows特定的库都不太可能具有相同类型的char / wchar_t重载,这使得TCHAR可用。

所以继续用wchar_t替换你所有的TCHAR

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

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

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

直接回答你的问题:

是否仍然需要使用Windows范围的function,或者我现在可以使用Unicode和UTF-8完成所有操作吗?

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

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

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

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

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

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