13

我发现 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                 | 
 | 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                 | 
 | u8"..." | C11 | char[]     | A UTF-8 string literal is a sequence of zero |
 |         |     |            | or more multibyte characters                 | 
 +---------+-----+------------+----------------------------------------------+

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

我不熟悉 UNIX 规范。UNIX 规范是否对这些规则指定了任何附加约束?

另外,如果有人能告诉我GCC 和 MSVC 使用什么字符集/编码方案,那也会有所帮助。

4

2 回答 2

6

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

于 2012-08-30T19:58:38.097 回答
4

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

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

VC++ 采用控制面板设置的默认值。该默认控制面板设置因购买 Windows 的国家/地区而异,大多数用户从不更改它,但他们可以在安装 Windows 时更改它,以后可以更改它。

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

于 2012-08-31T02:29:20.190 回答