首页 文章

字符集 - 不清楚

提问于
浏览
10

标准定义

  • 基本源字符集

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

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

$ 2.2 / 3-“执行字符集和执行宽字符集分别是基本执行字符集和基本执行宽字符集的超集 . 执行字符集成员的值是实现定义的,以及任何其他成员都是特定于语言环境的 . “

Q1 . 我不认为我完全理解这一点,特别是最后的陈述 . 有关这方面的任何指示?

进一步,

$ 3.9.1 - “声明为字符(char)的对象应足够大,以存储实现的基本字符集的任何成员 . ”

Q2 . 在3.9.1中,短语“基本字符集”表示“基本执行字符集”?

1 回答

  • 17

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

    The basic source character set:

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

    此字符集恰好有96个字符 . 它们适合7位 . 像 @ 这样的字符不包括在内 .

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

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

    The basic execution character set …

    §2.1.3:基本执行字符集和基本执行宽字符集应各自包含基本源字符集的所有成员,以及表示alert,backspace和回车符的控制字符,以及空字符(分别) ,null宽字符),其表示具有全零位 .

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

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

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

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

    … and The basic execution wide character set:

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

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

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

    Converting between basic character sets:

    §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
    

    Something about file encodings:

    有几种文件编码 . 例如ASCII,其长度为7位 . Windows-1252这是8位长(称为 ANSI ) . ASCII 不包含非英文字符 . ANSI 包含一些欧洲字符,如 ä Ö ä Õ ø .

    较新的文件编码(如UTF-8UTF-32)可以包含任何语言的字符 . UTF-8 是字符长度可变 . UTF-32 长度为32位字符 .

    File enconding requirements:

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

    需要以文件编码对c源文件进行编码,该文件编码具有基本源字符集的表示 . 例如:源文件的文件编码需要具有 ; 字符的表示 .

    如果您可以在选择的编码中键入字符 ; 作为源文件的编码,该编码不适合作为c源文件编码 .

    Non-basic character sets:

    未包括在基本源字符集中的字符属于源字符集 . 源字符集等同于文件编码 .

    例如: @ 字符不包含在基本源字符中,但可以包含在源字符集中 . 选择的文件编码输入源文件可能包含 @ 的表示形式 . 如果它不包含 @ 的表示,则不能在字符串中使用字符 @ .

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

    请记住,编译器将字符从源字符集转换为执行字符集和执行范围字符集 . 因此,需要知道如何转换这些字符 .

    例如:如果指定 Windows-1252 作为源字符集的编码并指定 ASCII 作为执行宽字符集,则无法转换此字符串:

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

    这些字符无法在 ASCII 中表示 .

    Specifying character sets:

    以下是如何使用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字符可以双向转换而不会出现问题 .

    The extended character set:

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

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

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

相关问题