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

时间:2018-09-09 01:20:47

标签: c macos unicode clang constants

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

2 个答案:

答案 0 :(得分:2)

require('source-map-support').install(); char16_t在C标准中指定。 (以下引用来自2018年标准)。

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

根据条款7.28,这些类型中的每一个都是最窄的无符号整数类型,具有所需的位数。 (例如,在仅支持8、18、24和36以及50位无符号整数的实现中,#include <uchar.h>必须是18位大小;它不能是24位,而{{ 1}}必须是36。)

根据第6.4.5节,当字符串文字以uchar16_tuchar32_t作为前缀时,例如uU中,它是一个宽字符串文字,其中元素的类型分别为u"abc"U"abc"

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

答案 1 :(得分:0)

Microsoft的描述很公道:https://docs.microsoft.com/en-us/cpp/cpp/char-wchar-t-char16-t-char32-t?view=vs-2017

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

  • wchar是Windows使用的16位“宽字符”。微软是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编码最简单。