人类的文字信息由各种各样的符号构成
文字-----符号
这些符号是不能在磁盘或内存当中存储的,计算机最早是由老美发明出来的,内存和磁盘当中只有 0,1,严格来说内存和磁盘中只能表示整型,那么我们应该怎么表示符号--------编码
一字节8比特位:0~127
编码是值和符号的映射编码关系:
ascll编码表:
1.ASCII中的0~31为控制字符;32~126为打印字符;127为Delete(删除)命令
2.ASCll编码表本质就是英文符号和值的映射关系;
3.(核心符号26(大写)+26(小写)+10(阿拉伯数字))+常见符号,这些还有空余,早期就将这些空余用表情包来编码;
int main()
{
char buff[] = "apple sort";
return 0;
}
计算机并不会在底层存储apple和sort这两个单词,而是存对应的编码值:
内存存值,显示符号,打印时访问内存,有很多个字节,拿到第一个字节是97,再拿97去编码里面去查,97映射的符号是a,所以显示对应的符号,所以打印的时候就是查编码表的过程
那我们直接取值:
乱码就是值和表对不上
但是ASCll是适合老美的,编码表是来表示文字的,计算机要继续推广,我们的文化博大精深,汉族就有近10万个,从国际上来,我们需要一个比较统一的编码表:Unicod
统一码(Unicode),也叫万国码、单一码,由统一码联盟开发,是计算机科学领域里的一项业界标准,包括字符集、编码方案等;
统一码是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求;
随着发展,又给了许多方案,我们重点关注UTF-8/16/32
UTF-8可以认为还是8个比特位去对应一个符号,但是不一定是8个比特位,有可能是2个8个比特位的组合表示一个符号,是一个变长编码,兼容ASCll(比如中英混合),也就是UTF-8就是以1个字节为单位;
UTF-16就是以2个字节为单位;
UTF-16就是以4个字节为单位;
由兼容性和适用性,UTF-8比较常用
这也是为什么C++的string要设计成模板(char)(char16_t)(char32_t)
小知识:
GBK:
GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification) ,中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订,国家技术监督局标准化司、电子工业部科技与质量监督司1995年12月15日联合以技监标函1995 229号文件的形式,将它确定为技术规范指导性文件。2000年已被GB18030-2000《信息交换用 汉字编码字符集 基本集的扩充》国家强制标准替代。 [1]2005年GB18030-2005发布,替代了GB18030-2000。