使用 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 位整数的机器,因此您不必担心这一点。
话虽如此,除了某些编程语言(例如 Java 和 JavaScript)之外,UTF-16 在 Unix 上被认为在功能上已过时。 Unix系统绝大多数使用UTF-8(总是没有BOM)来存储数据,这也是大多数跨平台文件和数据交换格式(包括HTML、JSON和CBOR等)使用的数据格式。 C 标准库确实支持 Unix 上的
wchar_t
,但这几乎总是 32 位 UTF-32 值而不是 UTF-16。此外,大多数 Unix API 都接受字节字符串,对于文本来说,字节字符串通常以 UTF-8 编码(但通常可以包含任意非 NUL 字节),并且根本没有 UTF-16 或 UTF-32 版本。
因此,不存在可以在任何地方使用的单一标准编码。 UTF-8 Everywhere 网站有一个处理 Windows 的建议,这意味着大多数数据都以 UTF-8 存储,并直接围绕 API 调用进行转换。这与 Rust 使用的方法非常相似,并且是我在处理跨平台软件时最推荐的方法,除非您非常确定需要不同的东西。