代码之家  ›  专栏  ›  技术社区  ›  yg-i

C的“基本执行字符集”中的字符总数究竟是多少?

  •  0
  • yg-i  · 技术社区  · 1 年前

    cppreference.com上的以下页面似乎不一致:

    1. https://en.cppreference.com/w/c/language/charset

    基本字符集也称为 基本源字符集 . 基本执行字符集包含基本字符集的所有成员,以及以下字符: U+0000空 U+0007贝尔 U+0008退格 U+000A线路馈电(LF) U+000D回车(CR)

    1. https://en.cppreference.com/w/c/language/memory_model

    字节是内存中最小的可寻址单元。它被定义为一个连续的位序列,足够大,可以容纳的任何成员 基本执行字符集 (要求为单字节的96个字符)。C支持大小为8位或更大的字节。

    1. https://en.cppreference.com/w/c/language/translation_phases

    源字符集是一个多字节字符集,它包括作为单字节子集的基本源字符集,由以下96个字符组成:。。。

    ……只要阶段1中列出的基本源字符集中的所有96个字符都具有单字节表示

    基本执行字符集(BECS)和基本源字符集(BSCS)在逻辑上不可能都有96个字符 BECS包含BSCS的所有成员加上5个控制字符。


    最新的C23草案如下: https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3096.pdf

    C17的最新草案如下: https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2310.pdf

    最相关的段落可以通过ctrl+f找到这些pdf文件中的字符串“基本源和基本执行字符集”。

    我从阅读这些文章中得到的印象是,BECS是BSCS的一个合适的超集,正如cppreference的字符集页面上所述。但我不太愿意得出结论,就像我似乎被迫得出的那样,cpprreference(我通常认为它非常可靠)是错误的 二者都 在内存模型页上 在翻译阶段页面上。那么,发生了什么事?

    2 回复  |  直到 1 年前
        1
  •  5
  •   Lundin    1 年前

    N3096不是最新的草案。

    C23的最新草案N3220(2024年1月)在5.2.1中规定如下:

    所有位都设置为0的字节,称为 空字符 ,应存在 在基本执行字符集中;它用于终止字符串。
    /--/
    基本源字符集和基本执行字符集都应具有以下成员:26 大写字母 拉丁字母表

    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
    

    26 小写字母 拉丁字母的

    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  
    

    小数点后10位 数字

    0 1 2 3 4 5 6 7 8 9  
    

    以下32 图形字符

    ! " # % & ’ ( ) * + , - . / :  
    ; < = > ? [ \ ] ^ _ { | } ~  
    @ $ `  
    

    空格字符,以及表示水平制表符、垂直制表符和表单提要的控制字符。

    1(无)+26+26+10+32+4(空格字符)=99

    之前的草案说29个图形字符,而现在的草案说32个,所以在之前的草案中,我们最终会得到96个。

    关于之前的C23草案N3096(2023年4月),请查看 What are source and execution character sets? 其中,3个新字符列在单独的子章节5.2.1.1中,该子章节后来被重新制作为5.2.2,并将这些字符添加到上述引用的表格中。

    我想,当人们将草稿视为最终文档时,就会发生这种情况。虽然技术内容是两年前投票通过的,但从编辑角度来看,这似乎还不是特别稳定。所以我们只能等待C23的发布 (…现在可能是任何一年,以ISO官僚机构的速度…)

    推荐文章