✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 🔥 所属专栏:C++深入学习笔记 💫 欢迎来到我的学习笔记!
一、什么编码?
编码:人类文字信息是有各种各样的符号组成的, 但是他们却不能直接在内存中存储。计算机内存里面只存储二进制信息0
、1
。无符号整型:0 ~ 255
共256个收据;有符号整型:-128 ~ 127
。那么内存中如何表示符号?
二、各种编码方式
2.1 ASCII编码表
这里就有了编码:一个值对应一个符号。比如说英美人为了表示出他们的文字,就创造出了ASCII
编码表,主要就是为了表示出他们自己的文字、常见符号等一共128个字符。
int main ( )
{
char buff[ ] = "apple sort" ;
return 0 ;
}
我们在监视窗口可以看见内存里面存储的内容:就是字符对应的ASCII码值。**ASCII编码表的本质:字符和值的映射。**打印输出的过程相当于是一个查编码表的过程。 内存里面存储的是值,对我们显示的是符号。
2.2 万国码
前面的ASCII码表没有其他国家的特殊字符,因此我们推出了万国码(Unicode
),也叫做统一码、单一码,编译了各个国家的文字符号! 万国码不断地发展改进和完善,现在主要有UTF-8
、UTF-16
、UTF-32
等,UTF-8
是一种变长编码,可以兼容ASCII编码,比较常用。只使用了0~127,所以可以认为是无符号类型的。几个字节对应一个符号,例如常见汉字也是使用2个字节来存储的。 UTF-8
的编码格式(一种变长编码 ):(简单了解即可)一个值对应一个符号
字节 格式 实际编码位 码点范围 1字节 0xxxxxxx(ASCII编码) 7 0~127 2字节 110xxxxx 10xxxxxx 11 128~2047 3字节 1110xxxx 10xxxxxx 10xxxxxx 16 2048~65535 4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 21 65536~2097151
UTF-16
两个字节为一个单位。UTF-32
就是以4字节为一个单位,但是会比较浪费空间。
# define _CRT_SECURE_NO_WARNINGS 1
# include <iostream>
using namespace std;
int main ( )
{
char str[ ] = "牛马" ;
char16_t str16[ ] = u"泥嚎" ;
char32_t str32[ ] = U"再见" ;
cout << sizeof ( str) << endl;
cout << sizeof ( str16) << endl;
cout << sizeof ( str32) << endl;
return 0 ;
}
根据下面的代码可以发现:万国码中的汉字是按照同音字进行存储的。(相当于是按照拼音存储的)
# define _CRT_SECURE_NO_WARNINGS 1
# include <iostream>
using namespace std;
int main ( )
{
char str[ ] = "泥嚎" ;
cout << strlen ( str) << endl;
str[ 0 ] ++ ;
cout << str << endl;
str[ 1 ] -- ;
cout << str << endl;
str[ 2 ] ++ ;
cout << str << endl;
str[ 3 ] -- ;
cout << str << endl;
return 0 ;
}
底层对应的值变化了,在表里面查询到的符号就变了,更加说明了值和符号之间的映射关系。UTF-8
就比较结合能空间,有些字符1个字节就够了。 这就是为什么string
需要实现为模板:默认string支持UTF-8
,在文档中就有说明的。 string
里面也提供了16、32的字符:char16_t
(数据前面加一个u
前缀)、char32_t
(数据前面加一个U
前缀,)等等。
宽字符:不确定大小长度的,就像long一样,在不同平台下的大小不一样。主要用来存储UTF-16。
char str[ ] = "牛马" ;
char16_t str16[ ] = u"泥嚎" ;
char32_t str32[ ] = U"再见" ;
wchar wstr[ ] = L"泥嚎" ;
cout << sizeof ( str) << endl;
cout << sizeof ( str16) << endl;
cout << sizeof ( str32) << endl;
cout << sizeof ( wstr) << endl;
2.3 GBK编码
GBK编码:我国自己的编码。GB+数字:都是这一系列的。它包括了汉字(包括中国台湾省的繁体、民族字体文字、古代文字、生僻字……)、韩语、日语(中日韩)。Windows
也是用的GBK编码。
三、ASCII编码详解
3.1.ASCII码的诞生
ASCII码开发始于1960年,由美国标准协会(ASA,现ANSI)技术委员会X3负责指定。最初的目的是为了一致地处理文本数据,解决当时不同计算机系统间数据交换不变的问题。
3.2.数字字符
ASCII码值 字符 描述 48 ‘0’ 数字0 49 ‘1’ 数字1 50 ‘2’ 数字2 51 ‘3’ 数字3 52 ‘4’ 数字4 53 ‘5’ 数字5 54 ‘6’ 数字6 55 ‘7’ 数字7 56 '8 数字8 57 ‘9’ 数字9
3.3.可打印字符
3.3.1.空格字符和标点符号
ASCII码值 字符 描述 32 (空格) 空格 33 ! 感叹号 34 ” 双引号 35 # 井号 36 $ 美元符号(英文字符) 37 % 百分号 38 & 和号 39 ’ 单引号 40 ( 做括号 41 ) 右括号 42 * 星号 43 + 加号 44 , 逗号 45 - 减号 46 . 句号 47 / 斜杠
3.3.2.数字
ASCII码值 字符 描述 48 0 数字0 49 1 数字1 50 2 数字2 51 3 数字3 52 4 数字4 53 5 数字5 54 6 数字6 55 7 数字7 56 8 数字8 57 9 数字9
3.3.3.大写字母
ASCII码值 字符 描述 65 A 大写字母 A 66 B 大写字母 B 67 C 大写字母 C 68 D 大写字母 D 69 E 大写字母 E 70 F 大写字母 F 71 G 大写字母 G 72 H 大写字母 H 73 I 大写字母 I 74 J 大写字母 J 75 K 大写字母 K 76 L 大写字母 L 77 M 大写字母 M 78 N 大写字母 N 79 O 大写字母 O 80 P 大写字母 P 81 Q 大写字母 Q 82 R 大写字母 R 83 S 大写字母 S 84 T 大写字母 T 85 U 大写字母 U 86 V 大写字母 V 87 W 大写字母 W 88 X 大写字母 X 89 Y 大写字母 Y 90 Z 大写字母 Z
3.3.4.小写字母
ASCII码值 字符 描述 97 a 小写字母a 98 b 小写字母b 99 c 小写字母c 100 d 小写字母d 101 e 小写字母e 102 f 小写字母f 103 g 小写字母g 104 h 小写字母h 105 i 小写字母i 106 j 小写字母j 107 k 小写字母k 108 l 小写字母l 109 m 小写字母m 110 n 小写字母n 111 o 小写字母o 112 p 小写字母p 113 q 小写字母q 114 r 小写字母r 115 s 小写字母s 116 t 小写字母t 117 u 小写字母u 118 v 小写字母v 119 w 小写字母w 120 x 小写字母x 121 y 小写字母y 122 z 小写字母z