简短回答:不。
的大小wchar_t
——基本字符单位——是没有定义的根据 C++ 标准(参见第 3.9.1 节第 5 段)。实际上,在 Windows 平台上它是两个字节长,在 Linux/Mac 平台上它是四个字节长。
此外,字符以特定于字节序的格式存储。在 Windows 上,这通常意味着小端,但它也适用于wchar_t
包含大端数据。
此外,尽管每个wchar_t
是两个(或四个)字节长,一个单独的字形(大致是一个字符)可能需要多个wchar_t
s,并且可能有不止一种方式来表示它。
一个常见的例子是角色é (LATIN SMALL LETTER E WITH ACUTE
),代码点 0x00E9。这也可以表示为“分解”的代码点序列 0x0065 0x0301(即LATIN SMALL LETTER E
其次是COMBINING ACUTE ACCENT
)。两者均有效;请参阅维基百科文章Unicode 等效项 http://en.wikipedia.org/wiki/Unicode_equivalence了解更多信息。
简而言之,您需要知道或选择您将使用的编码。如果处理 Windows API,一个简单的选择是假设所有内容都是以 2 字节存储的小端 UTF-16wchar_t
s.
在 Linux/Mac 上 UTF-8(带有char
s) 更常见,API 通常采用 UTF-8。wchar_t
被认为是浪费,因为它每个字符使用 4 个字节。
因此,对于跨平台编程,您可能希望在内部使用 UTF-8,并在调用 Windows API 时即时转换为 UTF-16。 Windows 提供了MultiByteToWideChar http://msdn.microsoft.com/en-us/library/dd319072.aspx and WideCharToMultiByte http://msdn.microsoft.com/en-us/library/dd374130.aspx函数来执行此操作,您还可以找到简化使用这些函数的包装器,例如ATL 和 MFC 字符串转换宏 http://msdn.microsoft.com/en-us/library/87zae4a3.aspx.
Update
该问题已更新为询问 Windows API 在询问字符串中的“字符数”时的含义。
如果 API 说“字符串的大小(以字符为单位)”,那么它们指的是字符串的数量wchar_t
s(或数量char
s 如果您由于某种原因在非 Unicode 模式下进行编译)。在那个具体案例您可以忽略这样一个事实:一个 Unicode 字符可能需要多个字符wchar_t
。这些 API 只是想要填充缓冲区,并且需要知道它们有多少空间。