在使用WinAPI时,经常使用的类型是wchar_t,但是我无意中找到了许多来源,它们说wchar_t不应该在其他平台上使用,因为它不是标准化的(在某些平台上是UTF-16,在其他平台上是UTF-32,等等). 如果wchar_t没有标准化,有没有一种类型(最好是UTF-16)可以可靠地跨Windows、MacOS和Linux使用,并且也与WinAPI兼容,或者以任何其他方式确保可移植性?
在使用WinAPI时,经常使用的类型是wchar_t,但是我无意中找到了许多来源,它们说wchar_t不应该在其他平台上使用,因为它不是标准化的(在某些平台上是UTF-16,在其他平台上是UTF-32,等等). 如果wchar_t没有标准化,有没有一种类型(最好是UTF-16)可以可靠地跨Windows、MacOS和Linux使用,并且也与WinAPI兼容,或者以任何其他方式确保可移植性?
该标准的较新版本提供char16_t
,将能够存储UTF-16.然而,C标准不能保证有任何大小正好为16位的类型,因此它可能大于16位.实际上,没有人使用没有16位整数的计算机,所以您不必担心这一点.
话虽如此,UTF-16在某些编程语言(如Java和JavaScript)之外的Unix上被认为在功能上已过时.Unix系统绝大多数使用UTF-8(总是没有BOM)进行数据,这也是大多数跨平台文件和数据交换格式(包括HTML、JSON和CBOR等)使用的数据格式.C标准库does在Unix上支持wchar_t
,但这几乎总是32位UTF-32值,而不是UTF-16.此外,大多数Unix API将接受字节字符串,对于文本,字节字符串通常以UTF-8编码(但通常可以包含任意的非NUL字节),并且根本没有UTF-16或UTF-32版本.
因此,不存在可以在任何地方使用的单一标准编码.UTF-8 Everywhere site has a recommendation for dealing with Windows,这意味着大多数数据以UTF-8格式存储,并直接围绕API调用进行转换.这与Rust使用的方法非常相似,也是我最推荐的处理跨平台软件的方法,除非您非常确定您需要一些不同的东西.