精华内容
下载资源
问答
  • C语言学习基本字符集

    千次阅读 2017-05-28 21:39:43
    我们将分五次讲解C语言...今天我们先说一说C语言的基本字符集。 1. 标识符的命名规则 1. 1什么是标识符? 在C语言中,符号常量,变量,数组,函数等都需要一定的名称,我们把这种名称成为标识符。也就是说,标识符

    我们将分五次讲解C语言的基本语法,这也将是学习C语言过程中最枯燥的部分。希望大家有心理准备。我会尽量用最轻松的方式讲解。过了这部分,后面的学习就会变得有意思一些了。

    基本语法.png

    今天我们先说一说C语言的基本字符集

    1. 标识符的命名规则

    1. 1什么是标识符?

    在C语言中,符号常量,变量,数组,函数等都需要一定的名称,我们把这种名称成为标识符。也就是说,标识符我们为C语言中出现的所有元素取得名字。

    1.2 标识符的命名规则

    • 只能由字母,数字,下划线,或者美元符号($)组成
    • 不能以数字开头 ;
    • 区分大小写,通常变量名和函数名都用小写字母表示;
    • 不能和C语言中的32个关键字重名

    这些规则在编译时IDE都会帮你检查,如果违反了它会报错。所以不用专门去记。

    2.关键字(保留字)

    C语言中具有特殊含义的英文单词。通常用于构成语句,存储数据,定义数据类型等

    C语言的共有32个关键字

    C语言的32个关键字

    这些关键字都是必须掌握的,不过不用死记硬背。等学完了相关的知识你在练习中自然就记住了。

    3.分隔符

    3.1空格

    C语言中,大部分空格没有实际意义,只是方便我们阅读,具体规则后面会讲到。

    3.2一般分隔符

    分号 (;) -语句结尾大括号 ({ }) -函数体,复合语句,以及数组的初始化等圆括号 () -函数定义时,将参数括起来,或者改变运算的优先顺序(和数学中的括号类似)方括号 () -定义数组类型和应用元素点号 (.) -结构体仲引用成员逗号 -参数分隔

    3.3注释符

    注释是程序设计中不可缺少的部分。但它仅仅能被我们编程者看到,对于计算机而言,它是透明的。

    //单行注释,用于注释这个符号后面的内容/* */多行注释,用于注释掉"\*"和"*/"之间的全部内容

    4.例程

    今天的内容就是这些,其实没有太难的东西,下面我们看一下上篇博文中Code::Blocks默认出现的那段代码,我做了简单的修改

    例程

    仔细看看这段代码,找找都用到了哪些今天提到过的东西。这里的代码几乎每次练习都要敲的,慢慢就都记住了。不懂的地方不用太纠结,这里只是先做了解,后面会仔细介绍。

    学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群

    639368839,我们一起学C/C++!

    展开全文
  • C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是常见的字符编码单位。但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码。  C95标准化了两种...
  • C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是最常见的字符编码单位。但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码。  C95标准化了两种...
  • C语言的基本字符集 1. 标识符的命名规则 1. 1 什么是标识符? 在C语言中,符号常量,变量,数组,函数等都需要一定的名称,我们把这种名称成为标识符。也就是说,标识符我们为C语言中出现的所有元素取得名字。 1.2 ...

    C语言过程中最枯燥的部分,分几次讲解,我会尽量用最轻松的方式讲解

    过了这部分,后面的学习就会变得有意思一些了

    C语言的基本字符集

    1. 标识符的命名规则

    1. 1 什么是标识符?

    在C语言中,符号常量,变量,数组,函数等都需要一定的名称,我们把这种名称成为标识符。也就是说,标识符我们为C语言中出现的所有元素取得名字。

    1.2 标识符的命名规则

    只能由字母,数字,下划线,或者美元符号($)组成

    不能以数字开头 ;

    区分大小写,通常变量名和函数名都用小写字母表示;

    不能和C语言中的32个关键字重名。

    这些规则在编译时IDE都会帮你检查,如果违反了它会报错。所以不用专门去记。

    2. 关键字(保留字)

    C语言中具有特殊含义的英文单词。通常用于构成语句,存储数据,定义数据类型等

    C语言的共有32个关键字

    这些关键字都是必须掌握的,不过不用死记硬背。等学完了相关的知识你在练习中自然就记住了。

    3. 分隔符

    3.1 空格

    C语言中,大部分空格没有实际意义,只是方便我们阅读,具体规则后面会讲到。

    3.2 一般分隔符

    分号 (;) - 语句结尾

    大括号 ({ }) - 函数体,复合语句,以及数组的初始化等

    圆括号 (()) - 函数定义时,将参数括起来,或者改变运算的优先顺序(和数学中的括号类似)

    方括号 ([]) - 定义数组类型和应用元素

    点号 (.) - 结构体仲引用成员

    逗号(,) - 参数分隔

    3.3 注释符

    注释是程序设计中不可缺少的部分。但它仅仅能被我们编程者看到,对于计算机而言,它是透明的。

    // 单行注释,用于注释这个符号后面的内容/* */ 多行注释,用于注释掉"*"和"*/"之间的全部内容

    4. 例程

    今天的内容就是这些,其实没有太难的东西,下面我们看一下最简单的那段代码,我做了简单的修改

    仔细看看这段代码,找找都用到了哪些今天提到过的东西。这里的代码几乎每次练习都要敲的,慢慢就都记住了。不懂的地方不用太纠结,这里只是先做了解,后面会仔细介绍。

    另外如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!

    C语言C++编程学习交流圈子,Q群1030652847点击进入】微信公众号:C语言编程学习基地

    分享(源码、项目实战视频、项目笔记,基础入门教程)

    欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

    编程学习书籍分享:

    编程学习视频分享:

     

    展开全文
  • 字符集(Character set)多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。 那么为什么会有那么多字符集...

    1.基础知识

    1.1.字符集

    字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。 
    字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。
    那么为什么会有那么多字符集标准呢?这是因为,很多规范和标准在最初制定时并没有意识到这将会是以后全球普适的准则,或者出于组织本身利益考虑想从本质上区别于现有标准。于是,就产生了那么多具有相同效果但又互不兼容的标准。

    1.2.字符编码

    字符编码(Character encoding),是把字符集中的字符,编码为指定集合中某一对象,以便在计算机中存储和通过网络的传递。
    一般而言,会直接将字符在字符集中的位置,或者说是码点(code point),作为编码后的值。故而,“字符集”和“字符编码”二者是紧密耦合的。因此,某种字符集也可以说成是某种字符编码方式,例如,当我们说到“ASCII”时,既可以指代ASCII字符集,也可以指代ASCII编码。

    2.常用字符集&字符编码

    2.1.ASCII

    ASCII(American Standard Code for Information Interchange,美国信息互换标准编码)是基于基础拉丁字符的一套编码系统。它主要用于显示现代英语。
    ASCII用7bit来编码字符,共128个码位,由于计算机1个字节是8bit,所以最高位为0,即00000000-01111111(0x00-0x7F)。其中有95(十进制32-126)个可打印字符,包括常用的字母、数字、标点符号等,另外还有33(十进制0-31及127)个控制字符。ASCII字符编码对应规则如下:

     

    ASCII是美国人设计的,只能支持基础拉丁字符,但是欧洲不只是用基础拉丁字符的国家该怎么办呢?最简单的办法就是将ASCII没有用到的第8位也用上,这样能表达的字符个数就达到了256个,相较原来,增长了一倍, 这就是EASCII。EASCII基本解决了整个西欧的字符编码问题。但是对于欧洲其它地方如北欧,东欧地区,256个字符还是不够用,因此出现了ISO 8859。为解决256个字符不够用的问题,ISO 8859采取的不再是单个独立的编码规则,而是由一系列的字符集(共15个)所组成,分别称为ISO 8859-n(n=1,2,3…11,13…16,没有12)。其每个字符集对应不同的语言,如ISO 8859-1对应西欧语言,ISO 8859-2对应中欧语言等。EASCII字符编码对应规则如下:(含表格符号、计算符号、希腊字母和特殊的拉丁符号等)

     

    2.2.中文编码

    为了扩充ASCII,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了GB2312(简体中文),BIG5(繁体中文),JIS(日文)等各自的编码标准。

    2.2.1.GB2312

    为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码。其中最有影响的是于1980年发布的《信息交换用汉字编码字符集·基本集》,标准号为GB 2312-1980。GB2312通行于我国内地,新加坡等地也采用此编码标准,并且几乎所有的中文系统和国际化的软件都支持GB2312。 
    GB2312是一个简体中文字符集,收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。其中包括6763个汉字,含一级汉字3755个,二级汉字3008个;包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。GB2312对所收录字符进行了“分区”处理,共94个区,区从1(十进制)开始,一直到94(十进制),每区含有94个位,位从1(十进制)开始,一直到94(十进制),共8836(94 * 94)个码位。由此,每个字符都能找到其唯一对应的区位和码位,这种表示方式也称为区位码。各区具体说明如下:

    1

    01-09区收录除汉字外的682个字符,有164个空位(9 * 94 - 682)

    2 10-15区为空白区,没有使用
    3 16-55区收录3755个一级汉字(简体),按拼音排序
    4 56-87区收录3008个二级汉字(简体),按部首/笔画排序
    5 88-94区为空白区,没有使用

     

    GB2312以区位码为基础,对字符采用双字节编码,其中高字节表示区码,低字节表示位码。由于区码和位码的取值范围均在1-94之间,此范围同ASCII的编码范围冲突。例如汉字‘珀’在GB2312中的区位码为7174(十进制),其双字节表示形式为71、74;而两个ASCII字符‘GJ’的存储码也是71、74,这种冲突将导致解码时的混乱。为解决这个问题,GB2312将区位码均加上0xA0,这样高低字节的第8位都变成了1,进而同ASCII区分开来。具体操作如下图:

     

    例如,‘李’字的区位码为3278(表示在32区,78位),按照上图步骤获取其GB2312编码:

    1、将32(区)转化为十六进制为20;

    2、加上A0为C0;

    3、将78(位)转化为十六进制为4E;

    4、加上A0为EE;

    5、组合区和位,为C0EE;

    6、得到'李'字的GB2312编码为C0EE。

    所以说,GB2312是兼容ASCII的一种编码方式:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(高字节)范围从0xA1到0xF7,后面一个字节(低字节)范围从0xA1到0xFE,这样我们就可以组合出7000多个简体汉字了。在这些编码里,还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127以下的那些就叫”半角”字符了。 
    有人可能曾困惑过:GB2312采用双字节编码,原则上来说共有65536个码位,为何实际却只收录字符7445个?现在,我想答案应该是显而易见的:出于兼容ASCII和节省存储容量的考虑,GB2112的双字节编码是变长的,有些字符是单字节表示,如ASCII字符,有些字符是双字节表示,如汉字,由此而来的代价就是损失一部分码位;而且,编码的设计也并非想象的那样,所有字符从头到尾布满整个二维表,其中还预留有一部分空间以作他用。 
    GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。然而,对于人名、古汉语等方面出现的罕用字,GB2312却不能处理,这就导致了后来GBK及GB18030的出现。

    2.2.2.BIG5

    在台湾、香港与澳门地区,使用的是繁体中文字符集。而1980年发布的GB2312面向简体中文字符集,并不支持繁体汉字。在这些使用繁体中文字符集的地区,一度出现过很多不同厂商提出的字符集编码,这些编码彼此互不兼容,造成了信息交流的困难。为统一繁体字符集编码,1984年,台湾五大厂商宏碁、神通、佳佳、零壹以及大众一同制定了一种繁体中文编码方案,即Big5,又称大五码。 
    大五码是一种繁体中文汉字字符集,其中繁体汉字13053个,808个标点符号、希腊字母及特殊符号。大五码采用双字节编码,第1字节范围0x81-0xFE,避开了同ASCII码的冲突,第2字节范围是0x40-0x7E和0xA1-0xFE。因为Big5的字符编码范围同GB2312存在冲突,所以二者并不兼容。Big5字符编码分布表如下:

    编码范围(十六进制)

    符号类别

    8140-A0FE

    保留(用作造字区)

    A140-A3BF

    标点符号、希腊字母及特殊符号

    A3C0-A3FE

    保留(未开放用于造字区)

    A440-C67E

    常用汉字(先按笔划,再按部首排序)

    C6A1-C8FE

    保留(用作造字区)

    C940-F9D5

    非常用汉字(先按笔划,再按部首排序)

    F9D6-FEFE

    保留(用作造字区)

    Big5编码推出后,得到了繁体中文软件厂商的广泛支持,在使用繁体汉字的地区迅速普及使用。目前,Big5编码在台湾、香港、澳门及其他海外华人中普遍使用,成为了繁体中文编码的事实标准。在互联网中检索繁体中文网站,所打开的网页中,大多都是通过Big5编码产生的文档。 
    不过,尽管Big5码内包含一万多个字符,但是没有考虑社会上流通的人名、地名用字、方言用字、化学及生物科等用字,也没有包含日文平假名及片假名字母。

    2.2.3.GBK

    GBK即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。英文全称Chinese Internal Code Specification。GBK编码标准兼容GB2312,是对GB2312-80的扩展,简、繁体字融于一库。GBK采用双字节表示,总体编码范围为8140-FEFE,首字节在81-FE 之间,尾字节在40-FE 之间。总计23940 个码位,共收入21886个字符,其中汉字(包括部首和构件)21003 个,图形符号883 个。GBK同样兼容ASCII,00–7F范围内单字节表示ASCII字符。

    2.2.4.GB18030

    GB18030,全称GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,是我国政府于2000年3月17日发布的新的汉字编码国家标准,2001年8月31日后在中国市场上发布的软件必须符合本标准。 
    GB18030字符集标准解决了汉字、日文假名、朝鲜语和中国少数民族文字组成的大字符集计算机编码问题。该标准的字符总编码空间超过150万个编码位,收录了27484个汉字,覆盖中文、日文、朝鲜语和中国少数民族文字。满足中国大陆、香港、台湾、日本和韩国等东亚地区信息交换多文种、大字量、多用途、统一编码格式的要求。 
    GB18030标准采用单字节、双字节和四字节三种方式对字符编码,兼容ASCII、GB2312和GBK。

    2.2.5.小结

     

    3.Unicode

    3.1.Unicode字符集

    为什么有Unicode:虽然通过使用不同字符集,我们可以在一台机器上查阅不同语言的文档,但是我们仍然无法解决一个问题:在一份文档中显示世界上所有字符。为了解决这个问题,需要一个全人类达成共识的巨大的字符集,这就是Unicode字符集。 
    Unicode(中文:万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。 
    Unicode字符集包含了可能出现的所有字符,每个字符对应一个数字,这个数字即码点(Code Point),如字符‘H’的码点为72,字符‘李’的码点为26446。Unicode包含了1114112个码点,即0x000000-0x10FFFF。世界上所有字符都可以在Unicode字符集中找到对应的唯一码点。 
    Unicode按照使用上的频繁度将码空间划分为17个平面,00-10(十六进制,最高两位),即从0 - 16(十进制),每个平面有65536个码点(2^16),其中最重要的是第一个Unicode平面(码位0x0000-0xFFFF),包含了最常用的字符,该平面被称为基本多语言平面(Basic Multilingual Plane),缩写为BMP,其他平面称为辅助平面(Supplementary Planes),要么是用来表示一些远古时期的文字,要么是留作扩展。Unicode字符集中各个平面的基本情况如下:

     

    在BMP里的所有字符,要用4位十六进制数(例如U+4AE0,共支持六万多个字符);在BMP以外的字符则需要使用5位或6位十六进制数了。 
    Unicode只是一个字符集,只规定了字符所对应的码点,并没有指定字符编码方式,也即从码点到用来存储的比特流之间如何映射。关于这一点,我们不妨回忆一下之前曾经讲过的:一般而言,会直接将字符在字符集中的位置,或者说是码点,作为编码后的值。在这种方式下,字符集和字符编码耦合紧密,限制了字符集的扩展能力。鉴于此,Unicode将字符集和字符编码方案分离开,从字符到码点,再从码点到编码值,作了两次映射。这样,虽然每个字符在Unicode字符集中都能找到唯一确定的码点,但是最终的编码值却是由具体的编码方案决定。例如,同样是对字符“A”进行编码,UTF-8编码得到的值是0x41,而UTF-16(Big-Endian)得到的却是0x0041。

    3.2.编码方案

    Unicode的编码方案又叫Unicode转换格式,简称为UTF(Unicode Transformation Format),包括UTF-16、UTF-32以及UTF-8,其中又属UTF-8使用最为广泛。
    3.2.1.UTF-16
      UTF-16对应于UCS-2,采用双字节编码BMP内位于U+0000至U+D7FF以及U+E000至U+FFFF字符,编码后的值等同于对应的码点;由于BMP内的U+D800至U+DFFF码位不对应于任何字符,UTF-16借助于这些码位,根据一定的规则,采用四字节编码辅助平面内位于U+10000至U+10FFFF的字符。因此,UTF-16是一种变长编码方式。 
      UTF-16可看成是UCS-2的父集。在没有辅助平面字符前,UTF-16与UCS-2所指的是同一的意思。但当引入辅助平面字符后,就称为UTF-16了。现在若有软件声称自己支持UCS-2编码,那其实是暗指它不能支持在UTF-16中超过2字节的字集。对于小于0x10000的UCS码,UTF-16编码就等于UCS码。 
      UTF-16编码分大端序(Big-Endian,简称UTF-16 BE)和小端序(Little-Endian,简称UTF-16 LE)两种,区别在于字节序的不同。例如,汉字“奎”的Unicode码点是594E,“乙”的Unicode码点是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?UTF-16采用BOM(Byte Order Mark,字节序标记)机制来解决这个问题:在Unicode中有两个特殊字符,一个是U+FEFF,表示”ZERO WIDTH NO-BREAK SPACE”;另一个是U+FFFE,它在Unicode中是不存在的字符,所以不应该出现在实际传输中。UTF-16在传输字节流前,先传输一个BOM,这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。 
      以下的例子有四个字符:U+6731(朱)、U+002C(,)、U+807F(聿)、U+2A6A5(四个“龍”组成,无法显示)。

     

    3.2.3.UTF-8 
     UTF-8使用一至六个字节为每个字符编码
    1. 128个ASCII字符只需一个字节编码(U+0000至U+007F)。 
    2. 带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节编码(U+0080至U+07FF)。 
    3. 其他基本多文种平面(BMP)中的字符(这包含了大部分常用字,如大部分的汉字)使用三个字节编码(U+0800至U+FFFF)。 
    4. 其他极少使用的Unicode 辅助平面的字符使用四至六字节编码(U+10000至U+1FFFFF使用四字节,U+200000至U+3FFFFFF使用五字节,U+4000000至U+7FFFFFFF使用六字节)。 

     

      总结一下就是:1.对于单字节编码字符,字节的第一位设为0,后面7位为该字符的二进制Unicode码点值,故而UTF-8兼容ASCII;2.对于n字节编码字符(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10,剩下的二进制位,全部用该字符的二进制Unicode码点值替代。 
      来看个例子。字符“汉”表示为U+6C49,6C49在0800-FFFF之间,所以要用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001(不足16位,前面补0), 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,转换为十六进制,即UTF-8编码为E6 B1 89。
    UTF-8编码的优点: 
    1. ASCII是UTF-8的一个子集。因为一个纯ASCII字符串也是一个合法的UTF-8字符串,所以现存的ASCII文本不需要转换。为传统的扩展ASCII字符集设计的软件通常可以不经修改或很少修改就能与UTF-8一起使用。 
    2. UTF-8字符串可以由一个简单的算法可靠地识别出来。就是,一个字符串在任何其它编码中表现为合法的UTF-8的可能性很低,并随字符串长度增长而减小。举例说,字符值C0、C1、F5至FF从来没有出现。为了更好的可靠性,可以使用正则表达式来统计非法过长和替代值。 
    UTF-8编码的缺点: 
    1. 与其他Unicode编码相比,特别是UTF-16,在UTF-8中ASCII字符占用的空间只有一半,可是在一些字符的UTF-8编码占用的空间就要多出1/3,特别是中文、日文和韩文(CJK)这样的方块文字。
      由于在UTF-8编码中,其自身已经带了控制信息,如1110xxxx 10xxxxxx 10xxxxxx ,其中1110就起到了控制作用,所以不需要额外的BOM机制,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是0xEFBBBF,所以如果接收者收到以0xEFBBBF开头的字节流,就知道这是UTF-8编码了。但是需要注意,不是所有软件或者程序都能正确处理BOM标记,所以我们不推荐对UTF-8编码的文件加上BOM。

    4.判断字符串是否是utf-8编码格式

    int utf8_check(const char* str,size_t length)
    {
        size_t i = 0;
        int nBytes = 0;UTF8可用1-6个字节编码,ASCII用一个字节
        unsigned char ch = 0;
        bool bAllAscii = true;//如果全部都是ASCII,说明不是UTF-8
        while(i < length)
        {
            ch = *(str + i);
             if ((ch & 0x80) != 0)
                bAllAscii = false;
            if(nBytes == 0)
            {
                if((ch & 0x80) != 0)
                {
                    while((ch & 0x80) != 0)
                    {
                        ch <<= 1;
                        nBytes ++;
                    }
                    if((nBytes < 2) || (nBytes > 6))
                    {
                        return 0;
                    }
                    nBytes --;
                }
            }
            else
            {
                if((ch & 0xc0) != 0x80)
                {
                    return 0;
                }
                nBytes --;
            }
            i ++;
        }
        if(bAllAscii)
            return false;
        return (nBytes == 0);
    }
    展开全文
  • 一、编码 编码用预先规定方法将文字、...使用什么编码格式编码,就需要使用相同格式解码。 为了便于文件全球化交换与使用,有一些编码规则支持了很多语言转换规则。通过这种编码规则,就可以支持多种语言。

    一、编码

    编码是用预先规定的方法将文字、数字或其它对象编成数码。为保证编码的正确性,编码要规范化、标准化,即需有标准的编码格式。

    • 我们都知道文本在计算机中是以二进制来进行存储,这就需要把文字通过一定的规则转换成二进制来存储。这种规则就是编码。
    • 每个不同的国家,不同的地区都有自己不同的语言文字,这些文字通过不同的编码,转换成二进制信息进行存储。使用什么编码格式编码,就需要使用相同的格式解码。
    • 为了便于文件全球化交换与使用,有一些编码规则支持了很多语言的转换规则。通过这种编码规则,就可以支持多种语言。
    • 常见的编码格式有ASCII、ANSI、GBK、GB2312、UTF-8、GB2312-80和Unicode等。

    二、C语言的编码

    C语言是 70 年代的产物,那个时候只有ASCII,各个国家的字符编码都还未成熟,因此C语言不可能从底层支持 GB2312、GBK、Big5、Shift-JIS 等国家编码,也不可能支持 Unicode 字符集。

    在C语言中字符有两种,一种是窄字符,另一种是宽字符。

    • 只有 char 类型的窄字符才使用 ASCII 编码。
    • char 类型的窄字符串、宽字符和宽字符串都不使用 ASCII 编码。

    可以肯定的说,在现代计算机中,窄字符串已经不再使用 ASCII 编码,因为 ASCII 编码只能显示字母、数字等英文字符,对汉语、日语、韩语等其它地区的字符无能为力。对于窄字符串,C语言并没有规定使用哪一种特定的编码,只要选用的编码能够适应当前的环境即可,所以,窄字符串的编码与操作系统和编译器有关


    三、程序的编码

    (1)源文件使用什么编码呢?

    源文件用来保存我们编写的代码,它最终会被存储到本地硬盘,或者远程服务器,这个时候就要尽量压缩文件体积,以节省硬盘空间或者网络流量,而代码中大部分的字符都是 ASCII 编码中的字符,用一个字节足以容纳,所以 UTF-8 编码是一个不错的选择。

    UTF-8 兼容 ASCII,代码中的大部分字符可以用一个字节保存;另外 UTF-8 基于 Unicode,支持全世界的字符,我们编写的代码可以给全球的程序员使用,真正做到技术无国界。

    (2)常见的 IDE 或者编辑器使用的编码 

    所谓本地编码,就是像 GBK、Big5、Shift-JIS 等这样的国家编码(地区编码);针对不同国家发行的操作系统,默认的本地编码一般不同。简体中文本的 Windows 默认的本地编码是 GBK。 这就导致 Visual Studio在上传github时,出现中文乱码的现象。需要将文件强制转换成utf-8的编码模式。再进行上传。

    • 绝大多数的编译器,如:Xcode、Sublime、Text、Gedit、Vim等,在创建源文件时一般也默认使用 UTF-8 编码。
    • 奇葩 Visual Studio 它默认使用本地编码来创建源文件。 

    注意:对于使用 Visual Studio 上传 github 的用户。可以使用本地代码转换器,将GBK转换成UTF-8,便于在 github Desktop 中查看(github Desktop 不会转码,中文会出现乱码情况)。不过 github网页的代码会自动转码,不会出现乱码。

    (3)程序编译时的编码

    微软编译器使用本地编码来保存这些字符。不同地区的 Windows 版本默认的本地编码不一样,所以,同样的窄字符串在不同的 Windows 版本下使用的编码也不一样。对于简体中文版的 Windows,使用的是 GBK 编码。

    GCC、LLVM/Clang 编译器使用和源文件相同的编码来保存这些字符:如果源文件使用的是 UTF-8 编码,那么这些字符也使用 UTF-8 编码;如果源文件使用的是 GBK 编码,那么这些字符也使用 GBK 编码。

    你看,对于代码中需要被处理的窄字符串,不同的编译器差别还是挺大的。不过可以肯定的是,这些字符始终都使用窄字符(多字节字符)编码。

    对于 char 类型的窄字符串,微软编译器使用本地编码,GCC、LLVM/Clang 使用和源文件编码相同的编码。


    四、编码字符集和运行字符集

    站在专业的角度讲,源文件使用的字符集被称为编码字符集,也就是写代码的时候使用的字符集;程序中的字符或者字符串使用的字符集被称为运行字符集,也就是程序运行后使用的字符集。 

    源文件需要保存到硬盘,或者在网络上传输,使用的编码要尽量节省存储空间,同时要方便跨国交流,所以一般使用 UTF-8,这就是选择编码字符集的标准

    程序中的字符或者字符串,在程序运行后必须被载入到内存,才能进行后续的处理,对于这些字符来说,要尽量选用能够提高处理速度的编码,例如 UTF-16 和 UTF-32 编码就能够快速定位(查找)字符。

    注意:编码字符集是站在存储和传输的角度,运行字符集是站在处理或者操作的角度,所以它们并不一定相同。

    展开全文
  • C语言编程 | 转义字符

    2021-04-22 13:37:40
    C语言中,一个字符除了可以用它的实体(也就是真正的字符)表示,还可以用编码值表示。 这种使用编码值来间接地表示字符的方式称为转义字符(Escape Character)。 转义字符完整列表如下: 转义字符意义ASCII...
  • C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是最常见的字符编码单位。但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码。   C95标准化了
  • 2.2 64 位机上 64 位类型是什么? 2.3 怎样定义和声明全局变量和函数最好? 2.4 extern 在函数声明中是什么意思? 2.5 关键字 auto 到底有什么用途? 2.6 我似乎不能成功定义一个链表。我试过 typedef ...
  • 2.表示无法在当前上下文中被键盘录入的字符(如字符串中的回车符),或者在当前上下文中会有不期望的含义的字符(如C语言字符串中的双引号字符",不能直接出现,必须用转义序列表示) 另:什么是ASC
  • 沈阳师范大学大一上册C语言PTA题目以及答案(第一章 基本数据类型与表达式 选择题篇) 2-1 C 语言程序中可以对程序进行注释,注释部分必须用什么符号括起来? (1分) C. ‘/’ 和 '/’ 作者 往年试卷 单位 浙江大学...
  • 【locale】指一个程序或者操作系统所处国家、字符集、时间显示格式、货币符号等。在C标准库locale.h文件中定义了常量LC_ALL(全部locale项)、LC_COLLATE(排序)、LC_CTYPE(语言符号)、LC_MESSAGES、LC_...
  • 30_ 什么是ASCII + 字符本质上与整数存储方式相同【重点】 29_ char使用常见问题解析 28_ C编程预备计算机专业知识 _ 不同类型数据之间相互赋值问题 27_ C编程预备计算机专业知识 _ 什么是字节 26_ C编程预备...
  • 文章目录什么是C语言第一个C语言程序如何创建环境编写代码1.创建一个空项目2.创建一个源文件编写C语言程序1.编写代码2.运行代码数据类型变量,常量定义变量方法变量分类变量作用域和生命周期常量字面常量const...
  • 基本字符集 标识符命名规则 32个关键字 分隔符 数据类型 基本数据类型 其他数据类型 常量与变量 常量 变量 运算符与表达式 算数运算符 关系运算符 逻辑运算符 赋值运算 条件运算符 逗号运算符 长度测试...
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    什么是p而不是它指向的字符为const? 1.19 为什么不能像下面这样在初始式和数组维度值中使用const值?constintn=5;inta[n]; 1.20 constchar*p、charconst*p和char*constp有什么区别? 复杂的声明 1.21 怎样...
  • 项目属性页面有一个选项可以选择使用的字符集:>未设置>使用Unicode字符集>使用多字节字符集根据您选择的三个选项中的哪一个,更改了许多定义以适应所选字符集.有三个主要类:字符串,来自tchar....
  • ANSI C 主要标准化了现存实践, 同时增加了一些来自 C++ 内容 (主要函数原型) 并支持多国字符集 (包括备受争议三字符序列)。 ANSI C 标准同时规定了 C 运行期库例程标准。 一年左右以后, 该标准被接受为...
  • 团体程序设计天梯赛-练习 ...这什么模块?就是在字符串前填充一些东西到一定长度。例如用去填充字符串GPLT,使之长度为10,调用left-pad结果就应该*****GPLT。Node社区曾经对left-pad紧急发布了一
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...
  • C语言中级部分

    千次阅读 2012-04-01 13:08:26
    一.C语言基础部分掌握的是:基本知识和基本概念。告诉我们有些什么,能干什么。却没告诉何时使用,为何这样用,如何组合他们。 C初级告诉如何通过编译,C中级告诉如何避开虽然...字符集 关键字 运算符 标识符 表
  • C语言之枚举

    2017-11-12 18:29:00
    枚举在C语言中其实就是一些符号常量,简单来说,枚举就是定义了一些符号(字符串),这些字符的本质就是int类型常量,每个符号和一个常量相绑定,那么这个符号就成为了一个自定义识别码,对编译器来说对枚举...
  • L1-032 Left-pad (20分) 根据新浪微博上消息,有一位开发者不满NPM(Node Package ...这什么模块?就是在字符串前填充一些东西到一定长度。例如用去填充字符串GPLT,使之长度为10,调用left-pad结...
  • 本文简单介绍UCS,UNICODE和UTF-8,并利用C语言实现了UTF-8与UCS2之间互相转化。... UCS所有其它字符集标准一个超集,它保证也其它字符集双向兼容,即编码间相互转换不会丢失任何信息。UCS字符集U+0000到U+007F与

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 148
精华内容 59
关键字:

c语言的字符集是什么字符集

c语言 订阅