C 语言字符集

2024年8月28日 | 阅读 8 分钟

引言

字符集 是程序可以在各种上下文中使用的允许字符的集合。在本文中,我们回顾了字符编码的历史。在这里,我们还讨论了称为EBCDIC的历史编码系统、当前的编码标准 Unicode以及ASCII

字符集类型

通常,C 语言中有两种字符集。

源字符集 (SCS)

预处理之前,SCS用于将源代码解析为内部表示。空白字符基本字符集包含在此包中。它是可用于创建源代码的符号的集合。C 预处理器 (CPP) 的初始阶段是在预处理阶段之前将源代码的编码转换为源字符集 (SCS)

执行字符集 (ECS)

ECS 中存储了字符字符串的常量。此集包括控制字符、转义序列基本字符集。它是正在使用的程序可以识别的字符集。在预处理阶段之后,CPP 将字符和字符串常量编码转换为执行字符集 (ECS)

C 语言中实用函数的用法也用于描述不同类型的字符集。

CPP 中,源字符集执行字符集默认都使用UTF-8 编码。以下编译器标志允许用户更改它们。

-finput-charset 用于设置 SCS。

-fexec-charset 用于设置 ECS。

基本字符集

字符集中的方法字符很少共享。基本字符集是指标准字符的集合。下面我们详细讨论一下。

字母

它包含大写小写字母。小写 ASCII 字符的范围是[97, 122]大写 ASCII 字符的范围是[65, 90]示例: A、B、a、b 等。

大写和小写字符之间的差异很小。

实用函数

isalpha、islowerisupper 用于确定字符是大写、小写还是字母。使用 tolowertoupper 将字母转换为适当的大小写。

数字

它包含09数字(含)。ASCII 数字的范围是[48, 57]示例: 0、1、2 等。

实用函数

isdigit 函数用于确定提供的字符是否为数字isalnum 函数用于确定字符是否为字母数字字符。

标点符号/特殊字符

默认 C 语言环境将以下字符归类为标点符号

实用函数

ispunct 函数用于确定字符是否为标点符号。下表包含每种标点符号ASCII 码和用法示例。

CharacterASCII详情
!33感叹号、惊叹号或感叹符。
"34倒引号、引号或引语。
#35井号、数字号、英镑符号、井号或升号。
$36美元符号或通用货币符号。
%37百分号。
&38和符号、字母符号或“和”符号。
'39单引号或撇号。
(40左括号或左圆括号。
)41右括号或右圆括号。
*42星号,有时也称为星号,是乘法的数学符号。
+43加号。
,44逗号。
-45破折号、连字符或减号。
.46逗号、点或句号。
/47斜杠、逗号、斜线、正斜杠和数学上的除法符号。
:58冒号。
;59分号。
<60小于号或尖括号。
=61等号。
>62大于号或尖括号。
?63问号。
@64“@”符号、商业地址符号、at 或 at 符号。
[91方括号。
\92反斜杠或反斜杠。
]93左方括号。
^94插入符号或脱字符。
_95下划线。
'96重音符、左引号、反引号、重音符、重音符、重音符或尖音符。
{123左花括号、波浪括号或花括号。
}125右花括号、波浪括号或花括号。
~126波浪号。

控制字符集

这些字符的ASCII 码范围是0 到 31(含)和第 127 个字符。虽然它们不可见,但它们仍然以多种方式影响程序。与键盘上的退格键删除前一个字符)不同,(BEL) 字符在打印时可能会产生蜂鸣声屏幕闪烁,而b (BS) 字符会将光标向后移动一步。

实用函数

iscntrl 函数用于确定字符是否为控制字符。

ASCII缩写
00NUL '\0' (空字符)
01SOH (标题开始)
02STX (文本开始)
03ETX (文本结束)
04EOT (传输结束)
05ENQ (询问)
06ACK (确认)
07BEL '\a' (响铃)
08BS '\b' (退格)
14SO (移出)
15SI (移入)
16DLE (数据链路转义)
17DC1 (设备控制 1)
18DC2 (设备控制 2)
19DC3 (设备控制 3)
20DC4 (设备控制 4)
21NAK (否定确认)
22SYN (同步空闲)
23ETB (传输块结束)
24CAN (取消)
25EM (介质结束)
26SUB (替换)
27ESC (转义)
28FS (文件分隔符)
29GS (组分隔符)
30RS (记录分隔符)
31US (单元分隔符)
127DEL (删除)

转义序列

执行字符集包含这些字符。您可以使用反斜杠 (/) 键来区分这些字符。尽管它包含两个或多个字符,但C 预处理器仅将其计为一个。

示例: a、b、t 等。

空白字符

源字符集包含这些字符。它们会影响显示的文本,但视觉上不可见。

实用函数

isspace 函数用于确定字符是否为空格。

CharacterASCII详情
<空格>32空格 (SPC)
\t9水平制表符 (TAB)
\n10换行符 (LF)
\v11垂直制表符 (VT)
\f12换页符 (FF)
\r13回车符 (CR)

示例

让我们用一个例子来打印所有字符

输出

| Character | ASCII | Type        |
| :-------: | ----: | :---------- |
|           |  32   | Space       |
|    !      |  33   | Punctuation |
|    "      |  34   | Punctuation |
|    #      |  35   | Punctuation |
|    $      |  36   | Punctuation |
|    %      |  37   | Punctuation |
|    &|  38   | Punctuation |
|    '      |  39   | Punctuation |
|    (      |  40   | Punctuation |
|    )      |  41   | Punctuation |
|    *      |  42   | Punctuation |
|    +      |  43   | Punctuation |
|    ,      |  44   | Punctuation |
|    -      |  45   | Punctuation |
|   .      |  46   | Punctuation |
|    /      |  47   | Punctuation |
|    0      |  48   | Digit       |
|    1      |  49   | Digit       |
|    2      |  50   | Digit       |
|    3      |  51   | Digit       |
|    4      |  52   | Digit       |
|    5      |  53   | Digit       |
|    6      |  54   | Digit       |
|    7      |  55   | Digit       |
|    8      |  56   | Digit       |
|    9      |  57   | Digit       |
|    :      |  58   | Punctuation |
|    ;      |  59   | Punctuation |
|    <|  60   | Punctuation |
|    =      |  61   | Punctuation |
|    >|  62   | Punctuation |
|    ?      |  63   | Punctuation |
|    @      |  64   | Punctuation |
|    A      |  65   | Alphabet    |
|    B      |  66   | Alphabet    |
|    C      |  67   | Alphabet    |
|    D      |  68   | Alphabet    |
|    E      |  69   | Alphabet    |
|    F      |  70   | Alphabet    |
|    G      |  71   | Alphabet    |
|    H      |  72   | Alphabet    |
|    I      |  73   | Alphabet    |
|    J      |  74   | Alphabet    |
|    K      |  75   | Alphabet    |
|    L      |  76   | Alphabet    |
|    M      |  77   | Alphabet    |
|    N      |  78   | Alphabet    |
|    O      |  79   | Alphabet    |
|    P      |  80   | Alphabet    |
|    Q      |  81   | Alphabet    |
|    R      |  82   | Alphabet    |
|    S      |  83   | Alphabet    |
|    T      |  84   | Alphabet    |
|    U      |  85   | Alphabet    |
|    V      |  86   | Alphabet    |
|    W      |  87   | Alphabet    |
|    X      |  88   | Alphabet    |
|    Y      |  89   | Alphabet    |
|    Z      |  90   | Alphabet    |
|    [      |  91   | Punctuation |
|    \      |  92   | Punctuation |
|    ]      |  93   | Punctuation |
|    ^      |  94   | Punctuation |
|    _      |  95   | Punctuation |
|    `      |  96   | Punctuation |
|    a      |  97   | Alphabet    |
|    b      |  98   | Alphabet    |
|    c      |  99   | Alphabet    |
|    d      | 100   | Alphabet    |
|    e      | 101   | Alphabet    |
|    f      | 102   | Alphabet    |
|    g      | 103   | Alphabet    |
|    h      | 104   | Alphabet    |
|    i      | 105   | Alphabet    |
|    j      | 106   | Alphabet    |
|    k      | 107   | Alphabet    |
|    l      | 108   | Alphabet    |
|    m      | 109   | Alphabet    |
|    n      | 110   | Alphabet    |
|    o      | 111   | Alphabet    |
|    p      | 112   | Alphabet    |
|    q      | 113   | Alphabet    |
|    r      | 114   | Alphabet    |
|    s      | 115   | Alphabet    |
|    t      | 116   | Alphabet    |
|    u      | 117   | Alphabet    |
|    v      | 118   | Alphabet    |
|    w      | 119   | Alphabet    |
|    x      | 120   | Alphabet    |
|    y      | 121   | Alphabet    |
|    z      | 122   | Alphabet    |
|    {      | 123   | Punctuation |
|    |      | 124   | Punctuation |
|    }      | 125   | Punctuation |
|    ~      | 126   | Punctuation |

说明

在此示例中,ctype.h 头文件用于定义 isalpha 和 isdigit 实用函数。因此,我们将其放在顶部。之后,我们从ASCII 码 32 开始循环,因为我们不打印控制字符,因为它们不可见。

我们使用实用函数来确定字符类型。此程序会生成一个格式化的字符Markdown 表格

结论

C 语言中有两种不同的字符集:源字符集 (SCS)执行字符集 (ECS)

预处理之前,SCSCPP从源代码创建。CPP 在被转换为ECS之前预处理字符字符串常量。尽管空格字符看起来是空白的,但它们会影响文本。尽管控制字符在视觉上不可见,但它们可以执行各种任务,例如发出蜂鸣声 (a)、将指针移到左边 (b) 等。

ctype.h 中有许多有用的函数可用于处理字符,例如 isalphaisdigit