C语言字符集

本文主要探讨C语言的字符集,包括通用字符集如ASCII、UTF-8和GB2312,以及C标准字符集的详细内容。讨论了源文件字符集与执行字符集的区别,多字节字符在源文件和执行环境中的表示,以及C标准对多字节字符序列的规定。

系列文章目录

  1. C语言综述1
  2. C语言字符集2
  3. C语言词法元素3
  4. C语言表达式4
  5. C语言语句5
  6. C语言声明6
  7. C语言预处理指令7
  8. C语言头文件8


前言

蓝色问号代表个人理解   绿色代表来源   红色问号代表尚有疑问

为什么要读标准?因为全面、权威,所有答案都在标准里面!
哪些人适合浏览本系列文章?不清楚C语言程序的组成,以及每个组成部分的详细内容
持续更新,码字不易,求点赞收藏


1、字符集

  1. 一是写入源文件的字符集,即当前编辑器页面使用的字符集
  2. 二是执行环境中解释的字符集,执行字符集成员的值由实现定义,即执行时将写入源文件的字符集转换成执行时使用的字符集
  3. 本节要求之外的任何其他字符都是特定于语言环境的

#include<bits/stdc++.h>
using namespace std;
int main(int argc,char *argv[]){
    printf("修仙");  //理论上UTF-8是支持中文的,但是printf的中文不对
    return 0;		//输出 淇粰
}
//字符集改成GB2312 出现上面的输出
#include<bits/stdc++.h>
using namespace std;

int main(int argc,char *argv[]){
    printf("淇�浠�");  //鐞嗚�轰笂UTF-8鏄�鏀�鎸佷腑鏂囩殑锛屼絾鏄痯rintf鐨勪腑鏂囦笉瀵�					
    //写入源文件的字符集是UTF-8,执行字符集可能根据的操作系统的字符集是GB2312
    return 0;
}

1.1、通用字符集

ASCII
  美国信息交换标准代码,等同于国际标准ISO/IEC 646。所以这是世界通用的编码,其他大部分字符集都兼容,所以不同字符集下的代码主体就不会有太大改变,而且编程语言都尽量避免使用地域特定的字符

BinDecHex缩写/字符解释
00000000000NUL(null)空字符
00000001101SOH(start of headling)标题开始
00000010202STX (start of text)正文开始
00000011303ETX (end of text)正文结束
00000100404EOT (end of transmission)传输结束
00000101505ENQ (enquiry)请求
00000110606ACK (acknowledge)收到通知
00000111707BEL (bell)响铃
00001000808BS (backspace)退格
00001001909HT (horizontal tab)水平制表符
00001010100ALF (NL line feed, new line)换行键
00001011110BVT (vertical tab)垂直制表符
00001100120CFF (NP form feed, new page)换页键
00001101130DCR (carriage return)回车键
00001110140ESO (shift out)不用切换
00001111150FSI (shift in)启用切换
000100001610DLE (data link escape)数据链路转义
000100011711DC1 (device control 1)设备控制1
000100101812DC2 (device control 2)设备控制2
000100111913DC3 (device control 3)设备控制3
000101002014DC4 (device control 4)设备控制4
000101012115NAK (negative acknowledge)拒绝接收
000101102216SYN (synchronous idle)同步空闲
000101112317ETB (end of trans. block)传输块结束
000110002418CAN (cancel)取消
000110012519EM (end of medium)介质中断
00011010261ASUB (substitute)替补
00011011271BESC (escape)溢出
00011100281CFS (file separator)文件分割符
00011101291DGS (group separator)分组符
00011110301ERS (record separator)记录分离符
00011111311FUS (unit separator)单元分隔符
001000003220(space)空格
001000013321!
001000103422"
001000113523#
001001003624$
001001013725%
001001103826&
001001113927
001010004028(
001010014129)
00101010422A*
00101011432B+
00101100442C,
00101101452D-
00101110462E.
00101111472F/
0011000048300
0011000149311
0011001050322
0011001151333
0011010052344
0011010153355
0011011054366
0011011155377
0011100056388
0011100157399
00111010583A:
00111011593B;
00111100603C<
00111101613D=
00111110623E>
00111111633F?
010000006440@
010000016541A
010000106642B
010000116743C
010001006844D
010001016945E
010001107046F
010001117147G
010010007248H
010010017349I
01001010744AJ
01001011754BK
01001100764CL
01001101774DM
01001110784EN
01001111794FO
010100008050P
010100018151Q
010100108252R
010100118353S
010101008454T
010101018555U
010101108656V
010101118757W
010110008858X
010110018959Y
01011010905AZ
01011011915B[
01011100925C|
01011101935D]
01011110945E^
01011111955F_
011000009660`
011000019761a
011000109862b
011000119963c
0110010010064d
0110010110165e
0110011010266f
0110011110367g
0110100010468h
0110100110569i
011010101066Aj
011010111076Bk
011011001086Cl
011011011096Dm
011011101106En
011011111116Fo
0111000011270p
0111000111371q
0111001011472r
0111001111573s
0111010011674t
0111010111775u
0111011011876v
0111011111977w
0111100012078x
0111100112179y
011110101227Az
011110111237B{
011111001247C
011111011257D}
011111101267E~
011111111277FDEL (delete)删除

UTF-8
  针对Unicode的一种可变长度字符编码,支持几乎所有字符。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部分修改后,便可继续使用

GB2312
  适用于汉字处理、汉字通信等系统之间的信息交换,支持简体中文
在这里插入图片描述
Unicode
  它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求

1.2、C标准字符集

  基本源文件字符集和基本执行字符集

基本源文件字符集和基本执行字符集必须存在
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
29个图形字符! " # % & ’ ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { 竖线 } ~
空格字符
3个控制字符(横向制表\t、纵向制表\v、换页\f)
  1. 0之后的数字字符的值比前一个大1

  2. 在字符常量或字符串常量中,执行字符集的成员应由源字符集的相应成员或由反斜杠\后跟一个或多个字符组成的转义序列表示

  3. 执行字符集还包括告警\a、退格\b、回车\r、新行\n、所有位为零的空字符\0(用于终止字符串)、源文件指示每行文本结尾的某种方式视为单个新行字符

  4. Dos、Windows回车+换行(CR+LF)表示下一行

  5. UNIX/Linux换行符(LF)表示下一行

  6. 苹果机(MAC OS系统)回车符(CR)表示下一行

  若在源文卷(source file)中遇到其他字符,则其行为是未定义的。除非出现在字符常量(character constants)、串字面值(string literals)、前导文卷名(header names)、注释(comment)或永不被转换为词法元素(token)的预处理词法元素(token)中

  ASCII != C字符集

多字节字符

  源文件字符集中可包含多字节字符,用于表示扩展字符集的成员, 比如,UTF-8。执行字符集中也可以包含多字节字符,且它们的编码不一定要与源字符集中的多字节字符的编码相同, 比如,GB2312。

  1. 应存之前定义的单字节字符
  2. 任何其他成员的存在、意义和表示都是特定于语言环境的
  3. 多字节字符可以具有依赖于状态的编码,其中每个多字节字符序列以初始移位状态开始,并在序列中遇到特定多字节字符时进入其他实现定义的移位状态。在初始移位状态下,所有单字节字符保留其通常的解释,并且不会改变移位状态。序列中后续字节的解释是当前移位状态的函数
  4. 所有位为零的字节应解释为与移位状态无关的空字符
  5. 所有位为零的字节不得出现在多字节字符的第二个或后续字节中
  6. 源文件中注释、字符串、字符常量或头文件名应以初始移位状态开始和结束
  7. 源文件中注释、字符串、字符常量或头文件名应由一系列有效的多字节字符组成

三联符序列
  为了使代码能用任何非ASCII的字符集编写,但是有些字符集缺少这些字符。

在这里插入图片描述

2、字符输入

在这里插入图片描述

3、字符显示

活动位置是显示设备上输出的下一个字符的位置,将可打印字符(由isprint定义)写入显示设备的是在活动位置显示该字符的图形表示,然后将活动位置前进到当前行的下一个位置。打印方向是特定于区域设置的。如果活动位置位于直线的最终位置(如果有),则行为未指定。

(警报)产生声音或可见警报激活位置不得改变
(退格)将活动位置移动到当前行上的上一个位置如果激活位置位于直线的初始位置,则行为未指定
(“表单馈送”)将活动位置移动到下一逻辑页开始处的初始位置
(“新行”)将活动位置移动到下一行的初始位置
(“回车”)将激活位置移动到当前行的初始位置
(“水平制表符”)将活动位置移动到当前行上的下一个水平制表位置如果活动位置位于或超过上次定义的水平制表位置,则行为未指定。
(“垂直选项卡”)将活动位置移动到下一个垂直制表位置的初始位置如果活动位置位于或超过上次定义的垂直制表位置,则行为未指定。









以上纯属个人观点,欢迎大佬批评指正
  1. https://blog.youkuaiyun.com/init33/article/details/121258745 ↩︎

  2. https://blog.youkuaiyun.com/init33/article/details/121318734 ↩︎

  3. https://blog.youkuaiyun.com/init33/article/details/121319873 ↩︎

  4. https://blog.youkuaiyun.com/init33/article/details/121323883 ↩︎

  5. https://blog.youkuaiyun.com/init33/article/details/121323943 ↩︎

  6. https://blog.youkuaiyun.com/init33/article/details/121323932 ↩︎

  7. https://blog.youkuaiyun.com/init33/article/details/121323958 ↩︎

  8. https://editor.youkuaiyun.com/md/?articleId=121323994 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值