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

9

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

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

C99在 5.2.1节中提到了这六个字符集。然而,我发现这些内容非常晦涩难懂,缺乏细节。

它只明确定义了基本执行字符集基本源字符集

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

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

a b c d e f g h i j k l m n o p q r s t u v w x y z

十个十进制数字:

0 1 2 3 4 5 6 7 8 9

29个图形字符:

! " # % & ' ( ) * + , – . / : ; < = > ? [ \ ] ^ _ { | } ~

四个空格字符:

空格、水平制表符、垂直制表符、换页符

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

感谢您能提供的任何帮助! :)

3个回答

5
除了你提到的基本字符集外,其余的字符集都是“实现定义”的。这意味着它们可以是任何东西,但是实现(即C编译器/库/工具链实现)必须记录这些决策。关键段落如下:
§3.4.1 “实现定义行为”:未指定的行为,每个实现都记录了如何进行选择
§3.4.2 “区域设置特定行为”:依赖于国籍、文化和语言的本地约定的行为,每个实现都记录了这些约定
§5.2.1.1 “字符集”:应定义两组字符及其相关的排序序列:源文件所写的集合(“源字符集”)和在执行环境中解释的集合(“执行字符集”)。每个集合进一步分为一个“基本字符集”,其内容由此子句给出,以及一个或多个“区域设置特定成员”(不是基本字符集的成员),称为“扩展字符”。组合集合也称为“扩展字符集”。执行字符集成员的值是“实现定义的”。
因此,请查看您的C编译器文档以了解其他字符集是什么。例如,在我的gcc手册页中,某些命令行选项说明如下:
-fexec-charset=charset 设置执行字符集,用于字符串和字符常量。默认值为UTF-8。charset可以是系统的“iconv”库例程支持的任何编码。
-fwide-exec-charset=charset 设置宽执行字符集,用于宽字符串和字符常量。默认值为UTF-32或UTF-16,取决于“wchar_t”的宽度。与-fexec-charset一样,charset可以是系统的“iconv”库例程支持的任何编码;但是,如果编码不完全适合“wchar_t”,则会遇到问题。
-finput-charset=charset 设置输入字符集,用于从输入文件的字符集到GCC使用的源字符集的转换。如果区域设置未指定或GCC无法从区域设置获取此信息,则默认值为UTF-8。这可以由区域设置或此命令行选项覆盖。当前,如果存在冲突,则命令行选项优先。charset可以是系统的“iconv”库例程支持的任何编码。
要获取iconv支持的编码列表,请运行iconv -l。我的系统有143种不同的编码可供选择。

2
就我所看到的,标准并没有将基本字符集作为与源字符集和执行字符集不同的东西来讨论。标准规定了两个字符集——源字符集和执行字符集。每个字符集都有一个“基本”和“扩展”组件(其中任何一个的扩展组件都可以是空集)。
您有一个“源字符集”,它由“基本源字符集”和零个或多个“扩展字符”组成。基本源字符集和这些扩展字符的组合称为扩展源字符集。
类似地,对于执行字符集(有一个基本执行字符集,加上零个或多个扩展字符组成扩展执行字符集)。
标准(以及您的问题)枚举了必须在基本字符集中的字符 - 基本集中可能还有其他字符。
就基本字符集和扩展字符集的差异而言,基本字符集成员的值必须适合一个字节,而对于扩展字符则没有此限制。还要注意,这并不一定意味着源文件编码必须是单字节编码。
源字符集中字符的值不需要与执行字符集中的值相符(例如,源字符集可能由ASCII组成,而执行字符集可能由EBCDIC组成)。

1
您可以查看GNU iconv。除了其他功能,它还可以打印或转换Java和C99字符串。 iconvlibiconv 的命令行接口,很可能是您的C99编译器在内部使用的字符转换工具。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接