WinApi 是否验证过 UTF-16?

Does the WinApi ever validate UTF-16?

Windows 文档重复引用了 UNICODE 和 UTF-16。我知道这是一个谎言,因为 file system (i.e. it accepts any sequence of wchar_t) and other documentation 暗示无效的 UTF-16 仅仅是“未定义的。所以我很困惑。我可以假设非文件系统 API 将 return 有效的 UTF-16 吗?或者我应该假设它不会?

编辑: 因为它引起了一些混乱,我将解释一些术语


UTF-16

UTF-16 定义在 Unicode specification (pdf). The FAQ 清楚什么是和不正确的 UTF-16:

Are there any 16-bit values that are invalid?

Unpaired surrogates are invalid in UTFs. These include any value in the range D80016 to DBFF16 not followed by a value in the range DC0016 to DFFF16, or any value in the range DC0016 to DFFF16 not preceded by a value in the range D80016 to DBFF16.

What about noncharacters? Are they invalid?

Not at all. Noncharacters are valid in UTFs and must be properly converted. For more details on the definition and use of noncharacters, as well as their correct representation in each UTF, see the Noncharacters FAQ.

所以唯一的限制是前导代理必须跟在尾随代理(也称为代理对)之后。所有其他 wchar_t(16 位)值应按原样接受。


UCS-2

如 Ben Voigt 的回答所述。这是一种现在已过时的编码,允许任何 wchar_t 值。由于它没有与 UTF-16 相同的限制,因此 UCS-2 字符串的子集是无效的 UTF-16。

Windows 宽字符是任意 16 位数字(以前称为 "UCS-2",在 Unicode 标准联盟清除该表示法之前)。所以你不能假设它将是一个有效的 UTF-16 序列。 (MultiByteToWideChar 是一个值得注意的例外,它 return 仅使用 UTF-16)

仅当生成字符串的程序使用 UTF-16 约定时,解码为 UTF-16 才有意义,但不能保证这一点,就像不能保证 8 位字符包含 UTF-8 一样。