我正在修改一些非常古老的(10年)C代码。该代码在Unix / Mac上使用GCC进行编译,并使用MinGW对Windows进行交叉编译。目前整个都有TCHAR字符串。我想摆脱TCHAR并使用C ++字符串代替。是否仍然需要使用Windows范围的功能,或者我现在可以使用Unicode和UTF-8执行所有操作吗?
答案 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设置,他们仍然会设法使其难以编写,难以阅读和不可移植。