char16_t 和 char32_t 到底是什么,我在哪里可以找到它们?

Rod*_*ier 4 c unicode macos constants clang

我一直在寻找char16_tand char32_t,因为我正在使用 Unicode,而我在网上能找到的只是它们在里面uchar.h。我在 iOS SDK(不是 macOS 的,出于某种原因)中发现了上述标题,但其中没有这样的类型。不过,我在不同的标题中看到了它们,但是我找不到它们的定义位置。此外,互联网上的信息充其量是稀缺的,所以我有点迷失在这里;但我确实读过wchar_t不应该用于Unicode,这正是我到目前为止所做的,所以请帮助:(

Eri*_*hil 5

char16_tchar32_t在 C 标准中指定。(以下引文来自 2018 年标准。)

根据第 7.28 条,标头将<uchar.h>它们声明为分别用于 16 位和 32 位字符的无符号整数类型。您不必在任何其他标题中寻找它们;#include <uchar.h>应该足够了。

同样根据第 7.28 条,这些类型中的每一种都是具有所需位数的最窄无符号整数类型。(例如,在仅支持 8、18、24、36 和 50 位无符号整数的实现中,char16_t大小必须为 18 位;不能为 24,而char32_t必须为 36。)

根据第 6.4.5 条,当字符串文字以uor为前缀时U,如在u"abc"or 中U"abc",它是一个宽字符串文字,其中元素分别具有类型char16_tor char32_t

根据第 6.10.8.2 条,如果 C 实现将预处理器宏定义__STDC_UTF_16__1,则表示char16_t值是 UTF-16 编码的。同样,__STDC_UTF_32__表示char32_t值是 UTF-32 编码的。在没有这些宏的情况下,不会对编码做出任何断言。

  • @RodrigoPelissier:确实,macOS 似乎不存在它,尽管它适用于 iOS。我建议就此向 Apple 提交错误报告。我希望使用 `typedef` 将类型定义为 `uint_least16_t` 和 `uint_least32_t` 可能是一种解决方法。C 标准要求它们与那些类型相同。 (2认同)

Gra*_*rks 1

微软有一个公平的描述:https://learn.microsoft.com/en-us/cpp/cpp/char-wchar-t-char16-t-char32-t ?view=vs-2017

  • char 是原始的、通常是 8 位的字符表示形式。

  • wchar 是 Windows 使用的 16 位“宽字符”。Microsoft 是 Unicode 的早期采用者,不幸的是,这使他们只能使用这种仅在 Windows 上使用的编码。

  • char16 和 char32,用于 UTF-16 和 -32

大多数非 Windows 系统使用 UTF-8 进行编码(甚至 Windows 10 也采用这种方式,https://en.wikipedia.org/wiki/Unicode_in_Microsoft_Windows#UTF-8)。UTF-8 是目前网络上最常用的编码。(参考: https: //en.wikipedia.org/wiki/UTF-8

UTF-8 存储在一系列字符中。UTF-8 可能是您最容易采用的编码,具体取决于您的操作系统。

  • 你是对的,你不能再像使用 ASCII 那样迭代 char 数组。一个字符可以是 1、2、3 或更多字节。虽然 UTF8 向后兼容 strcpy 等,但迭代或 strlen 则不然 - 它们对字节而不是字符进行操作。有趣的阅​​读:https://utf8everywhere.org。这个问题有提供跨平台解决方案的答案:/sf/ask/320545081/ (2认同)