gpt4 book ai didi

c++ - UTF16(例如 wide-winapi 函数所使用的)字符是否总是 2 个字节长?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:27 27 4
gpt4 key购买 nike

请为我解释一下,UTF16 是如何工作的?考虑到以下几点,我有点困惑:

  • C++中有一个静态类型WCHAR,是2个字节长。 (显然总是 2 个字节长)(更新:如答案所示,这个假设是错误的)。
  • 大多数 msdn 和其他一些文档似乎都假设字符总是 2 个字节长。这可能只是我的想象,我无法举出任何具体的例子,但似乎就是这样。
  • 在 C++ 或 Windows 中没有广泛使用的“超宽”函数或字符类型,因此我假设 UTF16 是所有需要的。
  • 据我所知,unicode 的字符数比 65535 多很多,因此它们显然没有足够的 2 个字节空间。
  • UTF16 似乎是 UTF8 的更大版本,UTF8 字符可以有不同的长度。

那么,如果一个 UTF16 字符不总是 2 个字节长,那么它还能有多长呢? 3个字节?或者只有 2 的倍数?然后例如,如果有一个 winapi 函数想要知道一个宽字符串的字符大小,并且该字符串包含 2 个字符,每个字符长 4 个字节,那么该字符串的大小如何以字符为单位 计算?

它是 2 个字符长还是 4 个字符长? (因为它是8个字节长,而每个WCHAR是2个字节)

更新:现在我看到字符计数不一定是标准事物或 C++ 事物,所以我将在第二个问题中尝试更具体一些,关于“字符”的长度宽字符串:

在 Windows 上,具体来说,在 Winapi 中,在其广泛的功能(以 W 结尾)中,如何计算由 2 个 unicode 代码点组成的字符串中的字符数,每个代码点由 2 个代码单元(总共 8 个字节)组成?这样的字符串是 2 个字符长(与代码点数相同)还是 4 个字符长(与代码单元总数相同?)

或者,更通用:Windows 定义的“宽字符串中的字符数”是什么意思,是代码点数还是代码单元数?

最佳答案

简短回答:否。

C++ 标准未定义wchar_t(基本字符单位)的大小(参见第 3.9.1 节第 5 段)。实际上,在 Windows 平台上它是两个字节长,而在 Linux/Mac 平台上它是四个字节长。

此外,字符以特定于字节序的格式存储。在 Windows 上,这通常意味着小端,但对于包含大端数据的 wchar_t 也是有效的。

此外,即使每个 wchar_t 都是两个(或四个)字节长,一个单独的字形(大致是一个字符)可能需要多个 wchar_t,并且可能有表示它的方式不止一种。

一个常见的例子是字符 é(带尖音符号的拉丁文小写字母 E),代码点 0x00E9。这也可以表示为“分解的”代码点序列 0x0065 0x0301(即 LATIN SMALL LETTER E 后跟 COMBINING ACUTE ACCENT)。两者都有效;请参阅关于 Unicode equivalence 的维基百科文章获取更多信息。

简单地说,您需要知道或选择您将使用的编码。如果处理 Windows API,一个简单的选择是假设所有内容都是小端 UTF-16 存储在 2 字节 wchar_ts 中。

在 Linux/Mac 上,UTF-8(使用 chars)更为常见,API 通常采用 UTF-8。 wchar_t 被认为是浪费,因为它每个字符使用 4 个字节。

因此,对于跨平台编程,您可能希望在内部使用 UTF-8,并在调用 Windows API 时即时转换为 UTF-16。 Windows 提供 MultiByteToWideCharWideCharToMultiByte函数来执行此操作,您还可以找到简化使用这些函数的包装器,例如 ATL and MFC String Conversion Macros .

更新

问题已更新为询问 Windows API 在询问字符串中的“字符数”时的含义。

如果 API 表示“字符串的大小(以字符为单位)”,它们指的是 wchar_t 的数量(或者如果您在编译时 char 的数量出于某种原因的非 Unicode 模式)。在那种特定情况下,您可以忽略一个 Unicode 字符可能占用多个 wchar_t 这一事实。这些 API 只是想填充缓冲区,并且需要知道它们有多少空间。

关于c++ - UTF16(例如 wide-winapi 函数所使用的)字符是否总是 2 个字节长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4652519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com