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

tin*_*ast 12 c c++ char character-encoding string-literals

我发现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                 | 
 +---------+-----+------------+----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 5

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

  • @H2CO3 C11 确实说 u8 文字是 utf-8。不过,我不确定编译器是否已经开始实现这一点 (2认同)