【问题标题】:What exactly are char16_t and char32_t, and where can I find them?char16_t 和 char32_t 到底是什么,我在哪里可以找到它们?
【发布时间】:2018-09-09 01:20:47
【问题描述】:

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

【问题讨论】:

  • 这只是typedef 的整数类型,例如unsigned shortunsigned int。没什么好说的了。
  • @DeiDei 所以,我真的不需要它们吗?有趣的。不过我还是想知道他们住在哪里……
  • 如果它们不存在,您可以随时自己键入定义...
  • 他们驻留在uchar.h。这就是标准所说的。如果您在某个实现中找不到它们,那纯粹是该实现的一个细节。它可能包含在文件的更深处。
  • @DeiDei - 这并不完全正确。 unsigned short 至少为 16 位(在任何现代健全的平台上都是如此);但unsigned int 不需要必须是 32 位。另一方面,unsigned long 至少需要 32 位宽。综上所述,不能提供准确的 8、16、32、64 位无符号/有符号类型(通过平台或编译器)的平台应被视为失败的 ISA/ABI。

标签: c macos unicode clang constants


【解决方案1】:

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 条,当字符串文字以 uU 为前缀时,如 u"abc"U"abc",它是一个宽字符串文字,其中元素的类型为 char16_tchar32_t,分别。

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

【讨论】:

  • 我绝对不能在 macOS 上包含这样的标题。
  • @RodrigoPelissier:确实,它似乎不存在于 macOS 上,尽管它适用于 iOS。我建议就此向 Apple 提交错误报告。我希望使用typedef 将类型定义为uint_least16_tuint_least32_t 可能是一种解决方法。 C 标准要求它们与那些类型相同。
  • 如何处理 EOF?
  • @RodrigoPelissier “我怎么能用这些处理 EOF”听起来像是另一个问题。也许在这里接受一个答案并发布一个新的查询。
  • 问题是Apple定义了__CHAR16_TYPE__,但没有在MacOS SDK中包含uchar.h,所以即使是预处理器也无法在不禁用所有Apple平台的情况下拯救你。
【解决方案2】:

微软有一个中肯的描述:https://docs.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 可能是最容易采用的编码,具体取决于您的操作系统。

【讨论】:

  • 我希望它能在尽可能多的平台上工作,但我目前专注于 macOS。我将语言环境设置为 UTF-8,但仅使用 char 时仍然遇到问题(我无法遍历它们,因为一个包含多个字符)。所以我使用了wchar_t,至少在我的Mac上,它运行良好;但是当我之前读到wchar_t 不应该用于此类目的时,我有点担心。
  • 您是对的,因为您不能再像使用 ASCII 那样迭代 char 数组。一个字符可以是 1、2、3 或更多字节。虽然 UTF8 向后兼容,例如strcpy,对于迭代或 strlen 而言并非如此-它们对字节而不是字符进行操作。有趣的阅​​读:utf8everywhere.org。这个问题有提供跨平台解决方案的答案:stackoverflow.com/questions/4579215/…
猜你喜欢
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 2017-01-08
  • 2012-07-07
  • 1970-01-01
  • 2019-10-17
相关资源
最近更新 更多