代码之家  ›  专栏  ›  技术社区  ›  Chubsdad

字符集-不清楚

  •  10
  • Chubsdad  · 技术社区  · 14 年前

    本标准规定

    • 基本源字符集

    • 基本执行字符集及其宽字符对应

    它还定义了“执行字符集”及其宽字符对应项,如下所示

    $2.2/3-“执行字符集 以及执行范围内的字符集 是基本执行的超集 字符集与基本执行 宽字符集。这个 执行成员的值 字符集是 定义的实施,以及 其他成员是 特定于区域设置。“

    Q1。我认为我不完全理解这一点,尤其是最后一句话。这方面有什么建议吗?

    此外,

    $3.9.1-“对象声明为 字符(char)应大 足以存储 实现的基本字符集。”

    Q2。在3.9.1中,“基本字符集”是指“基本执行字符集”?

    1 回复  |  直到 7 年前
        1
  •  17
  •   joke    14 年前

    您需要区分源字符集、执行字符集、连线执行字符集及其基本版本:

    基本源字符集:

    §2.1.1:基本源字符集由96个字符组成[]

    这个字符集正好有96个字符。它们适合7位。像这样的人物 @ 不包括在内。

    让我们获取一些基本源字符的二进制表示示例。它们可以是完全任意的,不需要这些对应于ASCII值。

    A -> 0000000
    B -> 0100100
    C -> 0011101
    

    基本执行字符集

    §2.1.3:基本执行字符集和基本执行范围字符集应分别包含基本源字符集的所有成员,加上表示警告、退格和回车的控制字符,再加上一个空字符(分别为空宽度字符),该字符集的演示文稿包含所有零位。

    如前所述,基本执行字符集包含基本源字符集的所有成员。它仍然不包括任何其他角色,比如 @ . 基本执行字符集可以具有不同的二进制表示形式。

    如前所述,基本执行字符集包含回车、空字符和其他字符的表示。

    A          -> 10110101010
    B          -> 00001000101    <- basic source character set
    C          -> 10101011111
    ----------------------------------------------------------
    null       -> 00000000000
    Backspace  -> 11111100011
    

    如果基本执行字符集为11位长(如本例中所示),则char数据类型应足够大以存储11位,但可能更长。

    _和基本执行范围字符集:

    基本执行范围字符用于宽字符(wchar_t)。它基本上与基本的执行范围字符集相同,但也可以有不同的二进制表示。

    A          -> 1011010101010110101010
    B          -> 0000100010110101011111    <- basic source character set
    C          -> 1010100101101000011011
    ---------------------------------------------------------------------
    null       -> 0000000000000000000000
    Backspace  -> 1111110001100000000001
    

    唯一固定的成员是空字符,它需要是 0 位。

    在基本字符集之间转换:

    §2.1.1.5:每个源字符集成员、转义序列或字符和字符串文本中的通用字符名转换为执行字符集的成员(2.13.2,2.13.4)。

    然后编译一个C++源文件,将源字符集的每个字符转换成基本的执行(宽)字符集。

    例子:

    const char* string0   =  "BA\bC";
    const wchar_t string1 = L"BA\bC";
    

    自从 string0 是普通字符,它将转换为基本执行字符集,并且 string1 将转换为基本的执行范围字符集。

    string0 -> 00001000101 10110101010 11111100011 10101011111
    string1 -> 0000100010110101011111 1011010101010110101010    // continued
               1111110001100000000001 1010100101101000011011
    

    关于文件编码:

    有几种文件编码。例如 ASCII 它有7位长。 Windows-1252 它是8位长的 ANSI ) ASCII 不包含非英文字符。 美国国家标准协会 包含一些欧洲字符,例如 ä Ö ä Õ ø .

    更新的文件编码,如 UTF-8 UTF-32 可以包含任何语言的字符。 UTF-8 IS字符的长度是可变的。 UTF 32 是32位字符长。

    文件编码要求:

    大多数编译器提供命令行开关来指定源文件的文件编码。

    C++源文件需要在具有基本源字符集表示的文件编码中进行编码。例如:源文件的文件编码需要具有 ; 性格。

    如果你能输入字符 ; 在编码中选择作为源文件的编码,编码不适合作为C++源文件编码。

    非基本字符集:

    基本源字符集中未包含的字符属于源字符集。源字符集等同于文件编码。

    例如: @ 字符不包含在基本源字符中,但可以包含在源字符集中。输入源文件的选定文件编码可能包含 @ . 如果它不包含 @ 你不能用这个角色 @ 在字符串中。

    不包含在基本(宽)字符集中的字符属于执行(宽)字符集。

    记住,编译器将字符从源字符集转换为执行字符集和执行范围字符集。因此,需要有一种方法来转换这些字符。

    例如:如果指定 窗户-1252 作为源字符集的编码并指定 ASCII 由于执行范围很广,无法转换此字符串:

    const char* string0 = "string with European characters ö, Ä, ô, Ð.";
    

    这些字符不能用 ASCII .

    指定字符集:

    下面是一些如何使用gcc指定字符集的示例。包括默认值。

    -finput-charset=UTF-8         <- source character set
    -fexec-charset=UTF-8          <- execution character set
    -fwide-exec-charset=UTF-32    <- execution wide character set
    

    使用UTF-8和UTF-32作为默认编码,C++源文件可以包含具有任何语言字符的字符串。UTF-8字符可以通过两种方式进行转换,不会出现问题。

    扩展字符集:

    _§1.1.3:多字节字符,表示源或执行环境扩展字符集成员的一个或多个字节序列。扩展字符集是基本字符集(2.2)的超集。

    多字节字符比普通字符的条目长。它们包含一个转义序列,将它们标记为多字节字符。

    多字节字符根据用户运行时环境中的区域设置进行处理。这些多字节字符在运行时转换为用户环境中的编码集。