C标准:字符集和字符串编码规范
我发现C标准(C99和C11)在字符/字符串代码位置和编码规则方面是模糊的:
首先,标准定义the source character set
和the 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使用哪种字符集/编码方案 ,这也会有所帮助。
C并不贪心字符集。 没有“默认字符集”这样的东西,它是实现定义的 - 尽管在大多数现代系统上它大部分是ASCII或UTF-8。
该标准没有指定默认编码,因为现有的实践已经在具有许多不同编码的机器上实现了C,例如霍尼韦尔大型机和IBM大型机。
我希望gcc从当前由LC_CHARSET指定的区域设置取其默认值,但我从未测试过它。
VC ++从控制面板设置中取其默认值。 该默认控制面板设置根据购买Windows的国家/地区而有所不同,大多数用户永远不会更改它,但可以在安装Windows时更改它,稍后可以更改它。
Trigraphs被发明出来,以便源程序可以从一个语言环境的环境复制到一个略有不同语言环境的环境中,并且仍然可以被编译。 例如,如果中国的Windows用户使用trigraph,那么希腊的Windows用户将能够编译相同的源程序。 但是,如果语言环境差异太大,例如使用EBCDIC和使用EUC的语言环境,trigraphs将不足以满足要求。
链接地址: http://www.djcxy.com/p/68389.html上一篇: C standard : Character set and string encoding specification
下一篇: character type int