我应该从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设置,他们仍然会设法使其难以编写,难以阅读和不可移植。