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

时间:2010-10-11 00:14:10

标签: c character-encoding c99

我正在为以下每个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个图形字符:

     

! “#%&'()* +, - 。/:;< =>?[\ _] ^ _ {|}〜

     

4个空格字符:

     

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

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

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

3 个答案:

答案 0 :(得分:5)

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

  

§3.4.1实施定义的行为
  每个实现都记录了如何做出选择的未指定行为

     

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

     

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

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

   -fexec-charset=charset
       Set the execution character set, used for string and character
       constants.  The default is UTF-8.  charset can be any encoding
       supported by the system's "iconv" library routine.

   -fwide-exec-charset=charset
       Set the wide execution character set, used for wide string and
       character constants.  The default is UTF-32 or UTF-16, whichever
       corresponds to the width of "wchar_t".  As with -fexec-charset,
       charset can be any encoding supported by the system's "iconv"
       library routine; however, you will have problems with encodings
       that do not fit exactly in "wchar_t".

   -finput-charset=charset
       Set the input character set, used for translation from the
       character set of the input file to the source character set used by
       GCC.  If the locale does not specify, or GCC cannot get this
       information from the locale, the default is UTF-8.  This can be
       overridden by either the locale or this command line option.
       Currently the command line option takes precedence if there's a
       conflict.  charset can be any encoding supported by the system's
       "iconv" library routine.

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

答案 1 :(得分:2)

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

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

类似地,对于执行字符集(有一个基本的执行字符集,结合零个或多个扩展字符组成扩展执行字符集)。

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

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

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

答案 2 :(得分:1)

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

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

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