我在哪里可以找到每个C99字符集的所有字符的表格?

我正在为以下每个C字符集中的每个字符寻找一个表(或生成一个表的方法):

  • 基本字符集
  • 基本执行字符集
  • 基本源字符集
  • 执行字符集
  • 扩展字符集
  • 源字符集

C99在5.2.1节中提到了所有这六个。 但是,我发现阅读非常神秘,缺乏细节。

它明确定义的唯一字符集是基本执行字符集基本源字符集

拉丁字母表中的52个大写和小写字母:

ABCDEFGHIJKLMNOPQRSTU VWXYZ

abcdefghijklmnopqrstu vwxyz

十位小数:

0 1 2 3 4 5 6 7 8 9

29个图形字符:

! “#%&’()* +, – 。/:; ?[\ _] ^ _ {|}〜

4个空格字符:

空格,水平标签,垂直标签,换页

我相信这些与基本字符集相同,但我猜测C99没有明确说明这一点。 其余的字符集对我来说有点神秘。

谢谢你尽你所能的帮助! 🙂

除了您提到的基本字符集之外,所有其他字符集都是实现定义的 。 这意味着它们可以是任何东西,但实现 (即C编译器/库/工具链实现) 必须记录这些决策。 这里的关键段落是:

§3.4.1 实现定义的行为
未指定的行为,其中每个实现记录了如何进行选择

§3.4.2 特定语言环境的行为
每个实施文件都依赖于当地的国籍,文化和语言惯例的行为

§5.2.1.1 字符集
应定义两组字符及其关联的整理顺序:写入源文件的集合( 源字符集 ),以及在执行环境( 执行字符集 )中解释的集合 。 每个集合进一步划分为基本字符集 ,其内容由本子条款给出,以及一组零个或多个特定于语言环境的成员 (不是基本字符集的成员),称为扩展字符 。 组合集也称为扩展字符集 。 执行字符集的成员值是实现定义的

因此,查看C编译器的文档以了解其他字符集是什么。 例如,在我的gcc手册页中,一些命令行选项说明:

    -fexec-字符集的字符集=
       设置执行字符集,用于字符串和字符
       常量。 默认值为UTF-8。  charset可以是任何编码
       由系统的“iconv”库例程支持。

    -fwide-EXEC-字符集的字符集=
       设置宽执行字符集,用于宽字符串和
       字符常量。 默认值为UTF-32或UTF-16,以较大者为准
       对应于“wchar_t”的宽度。 与-fexec-charset一样,
        charset可以是系统的“iconv”支持的任何编码
       图书馆常规; 但是,你会遇到编码问题
       不完全适合“wchar_t”。

    -finput-字符集的字符集=
       设置输入字符集,用于从中进行翻译
       输入文件的字符集到使用的源字符集
        GCC。 如果区域设置未指定,或GCC无法获取此信息
       来自语言环境的信息,默认为UTF-8。 这可以
       由locale或此命令行选项覆盖。
       目前,如果有a,命令行选项优先
       冲突。  charset可以是系统支持的任何编码
        “iconv”库例程。

要获取iconv支持的编码列表,请运行iconv -l 。 我的系统有143种不同的编码可供选择。

据我所知,该标准没有将基本字符集称为源字符集和执行字符集的不同之处。 该标准规定了它涉及的2个字符集 – 源字符集和执行字符集。 每个都有一个’基本’和’扩展’组件(任何一个的扩展组件都可以是空集)。

您有一个“源字符集”,它由“基本源字符集”和零个或多个“扩展字符”组成。 基本源字符集和那些扩展字符的组合称为扩展源字符集。

类似地,对于执行字符集(存在与零个或多个扩展字符组合的基本执行字符集构成扩展的执行字符集)。

标准(和您的问题)枚举必须在基本字符集中的字符 – 基本集中可以有其他字符。

至于每个字符集的基本“范围”和扩展“范围”之间的差异,基本字符集的成员值必须符合一个字节 – 该限制不适用于扩展字符。 另请注意,这并不一定意味着源文件编码必须采用单字节编码。

源字符集中的字符值不需要与执行字符集中的值一致(例如,源字符集可能由ASCII组成,而执行字符集可能是EBCDIC)。

你可能看看GNU iconv 。 在许多其他方面,它将打印或转换Java和C99字符串。 iconvlibiconv的命令行界面,很可能是您的C99编译器在内部用于这些字符转换的内容。

键入iconv -l以查看系统上可用的字符串。 您需要从源代码重新编译才能更改该集合。

在OS X上,我有141个字符集。 在Ubuntu上,我有1,168个字符集(其中大多数是别名)。