C标准:字符集和字符串编码规范

我发现C标准(C99和C11)在字符/字符串代码位置和编码规则方面含糊不清:

首先,标准定义the source character setthe execution character set 。 本质上它提供了一组字形,但没有将任何数值与它们相关联 – 那么什么是默认字符集?

我不是在这里询问编码,而只是字形/曲目到数字/代码点映射。 它确实将universal character names定义为ISO / IEC 10646,但它是否说这是默认的字符集?

作为上述的扩展 – 我找不到任何说明数字转义序列\ 0和\ x代表什么字符的内容。

从C标准(C99和C11,我没有检查ANSI C)我得到了关于字符和字符串文字的以下内容:

  +---------+-----+------------+----------------------------------------------+ | Literal | Std | Type | Meaning | +---------+-----+------------+----------------------------------------------+ | '...' | C99 | int | An integer character constant is a sequence | | | | | of one or more multibyte characters | | L'...' | C99 | wchar_t | A wide character constant is a sequence of | | | | | one or more multibyte characters | | u'...' | C11 | char16_t | A wide character constant is a sequence of | | | | | one or more multibyte characters | | U'...' | C11 | char32_t | A wide character constant is a sequence of | | | | | one or more multibyte characters | | "..." | C99 | char[] | A character string literal is a sequence of | | | | | zero or more multibyte characters | | L"..." | C99 | wchar_t[] | A wide string literal is a sequence of zero | | | | | or more multibyte characters | | u8"..." | C11 | char[] | A UTF-8 string literal is a sequence of zero | | | | | or more multibyte characters | | u"..." | C11 | char16_t[] | A wide string literal is a sequence of zero | | | | | or more multibyte characters | | U"..." | C11 | char32_t[] | A wide string literal is a sequence of zero | | | | | or more multibyte characters | +---------+-----+------------+----------------------------------------------+ 

但是我找不到关于这些文字的编码规则的任何信息。 UTF-8确实暗示了UTF-8编码,但我不认为它在任何地方都有明确提及。 另外,对于其他类型是编码未定义还是依赖于实现?

我不熟悉UNIX规范。 UNIX规范是否指定了这些规则的任何其他约束?

此外,如果有人能告诉我GCC和MSVC使用的charset /编码方案也会有所帮助。

C对字符集并不贪心。 没有“默认字符集”这样的东西,它的实现被定义 – 尽管在大多数现代系统中它主要是ASCII或UTF-8。

该标准没有指定默认编码,因为现有的实践已经在具有许多不同编码的机器上实现了C,例如霍尼韦尔大型机和IBM大型机。

我希望gcc从当前由LC_CHARSET指定的语言环境中取其默认值,但我从未测试过它。

VC ++从“控制面板”设置中采用其默认值。 默认的控制面板设置根据购买Windows的国家/地区而有所不同,并且大多数用户从不更改它,但是他们可以更改它,而安装Windows可以在以后更改它。

发明了Trigraphs,以便可以将源程序从具有一个语言环境的环境复制到具有稍微不同的语言环境并且仍然被编译的环境。 例如,如果中国的Windows用户使用trigraphs,那么希腊的Windows用户就可以编译相同的源程序。 但是,如果区域设置差异太大,例如使用EBCDIC和使用EUC的区域设置,则三元组将不够。