c语言 乱码转化为16进制_编码格式介绍及C语言处理汉字编码

什么是编码格式

从一个小问题引入

我们在学习C语言的时候,有一道必做的题目是将大写字母转换成小写,相信有点基础的同学都能不加思索的写出下面的代码:char toLower(char upper){

if (upper >= 'A' && upper <= 'Z'){

return upper + 32;

}else{

return upper;

}

}

要问为什么是这段代码?我们往往也能说得出:因为大小写字母在ASCII码上正好相差32(字符'a'为97, 字符'A'为65)。

我们在进行字符初始化的时候,往往会将字符初始化为'\0'。因为'\0'在ASCII码中对应的数值是0。

我们理所应当地知道char型字符对应的范围是0~127,因为ASCII码的范围就是0~127。

但是有没有想过,为什么是ASCII码?

所谓的ASCII码,又到底是什么?

编码格式介绍

要说起ASCII码,不得不说起编码格式。

我们知道,对于计算机来说,我们在屏幕上看到的千姿百态的文字、图片、甚至视频是不能直接识别的,而是要通过某种方式转换为0和1组成的二进制的机器码,最终被计算机识别(0为低电平,1为高电平)。

对于数字来说,有一套非常成熟的转换方案,就是将十进制的数字转换为二进制,就能直接被计算机识别(如5转换为二进制是 0000 0101)。但是对于像ABCD这样的英文字母,还有!@#$这样的特殊符号,计算机是不能直接识别的,所以就需要有一套通用的标准来进行规范。

这套规范就是ASCII码。

ASCII码使用127个字符,表示A~Z等26个大小写字母,包含数字0~9,所有标点符号以及特殊字符,甚至还有不能在屏幕上直接看到的比如回车、换行、ESC等。

eda194ef3243ff9e9e89feaa16bf0758.png

按照这套SACII的编码标准,就很容易的知道,'\0'代表的是0, 'A'代表的是65,而'a'代表的是97,'A'和'a'之间正好相差了32。

ASCII码虽然只有127位,但基本实现了对所有英文的支持。所以为什么说char类型只占1个字节?因为char型最大的数字是127,转成二进制也不过是0111 1111,只需要1个字节就能表示所有的char型字符,因此char只占1个字节。

但是随着计算机的普及,计算机不但要处理英文,还有汉字、甚至希腊文字、韩文、日文等诸多文字,这时,127个字符肯定不够了,这时就引入了Unicode的概念。

Unicode是一个编码字符集,它基本涵盖了世界上绝大多数的文字(只有极少数没有包含),在Unicode中文对照表中可以查看一些汉字的Unicode字符集。

比如,汉字”七“在Unicode表示为十六进制0x4e03,表示成二进制位0100 1110 0000 0011,占了15位,至少需要两个字节才能放得下,有些更复杂的生僻字,可能占用的字节数甚至不止两位。

这就面临着一个问题,当一个中英文夹杂的字符串输入到电脑的时候,计算机是如何知道它到底是什么的?

就像上面的0100 1110 0000 0011,它到底是表示的是0100 1110和0000 0011两个ASCII字符,还是汉字”七“?计算机并不知道。所以就需要一套规则来告诉计算机,到底该按照什么来解析。这些规则,就是字符编码格式。

其中就包括以下几种。ASCII

UTF-8

GBK

GB2312

GB18030

BIG5

ISO8859

编码格式分类

ASCII

ASCII 编码前面已经介绍过,此处就不再多说了。它使用0~127这128位数字代表了所有的英文字母以及数字、标点、特殊符号和键盘上有但屏幕上看不见的特殊按键。

它的优点是仅用128个数字就实现了对英文的完美支持,但是缺点也同样明显,不支持中文等除英文以外的其他语言文字。

因此,ASCII码基本可以看做是其他字符编码格式的一个子集,

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值