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

时间:2012-08-30 19:53:52

标签: c++ c character-encoding char 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                 | 
 +---------+-----+------------+----------------------------------------------+

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

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

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

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

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

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