前言
写了好些年代码了,却一直没有去深究这些基础,最近闲来有时间研究一下。建议从头开始看,因为这些知识点都是层层递进的。
英文 | 中文对照 |
---|---|
bit | 位(比特) |
byte | 字节 |
Byte和Bit
- bit 表示位。二进制数系统中,每个 0 或 1 就是一个位(bit),是存储信息的最小单位。
- Byte 表示字节。字节是由 8 个位所组成,一个字节存储 8 位无符号数,储存的数值范围为 0-255。
Byte和Int
- int类型会占用4个byte。
- byte 的大小范围是-128—127 ,int的大小范围是-2147483648到2147483647。
ASCII
将二进制通过一套特殊的规则转换为英文字符和一些特殊符号,这套编码格式就叫ASCII字符集。
- ASCII字符集,它使用7 bit来表示一个字符,总共表示128个字符
- ASCII字符集的最高位永远是0。0加上7bit 正好是8bit表示一个byte。例如第128个字符,它的二进制表示为 0111 1110。
Unicode
为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。ASCII为一个byte只能表示英文和一些特殊符号,Unicode是它的升级版。
Unicode 为世界上所有字符都分配了一个唯一的编号。
它是一种规定,Unicode 本身只规定了每个字符的编号是多少,并没有规定这个编号如何存储。 有的人会说了,那我可以直接把 Unicode 编号直接转换成二进制进行存储,是的,你可以。但是这种方法不一定是最好的,会在传输、存储中浪费很多内存空间,所以后续出现了多种UTF版本。
以英文字母 “I” 举例,它的Unicode唯一编号为 “0049” 。转化为二进制存储为”00000000 01001001“ ,但是用UTF-8存储为”01001001“,存储时候少了8位,这就是为什么需要UTF-16,UTF-8等格式了。
- 想了解更多unicode编码和utf-8编码的区别,请查看该博客
- UNICODE 最开始16bit的编码. 后来扩展到了21bit
- UTF(Unicode Transformation Format)为Unicode的各种扩展方案,增加运行效率或者易用性。简单来说,Unicode 是「字符集」而UTF-8 是「编码规则」
简述UTF-8、UTF-16、UTF-32的区别
- UTF-32 用四个byte表示一个字符
- UTF-16 用两个byte表示一个字符
- UTF-8 可变byte,比如汉字字符用3个byte,英语字符用1个byte。这样在多英文字符的时候,存储占用字节更小,利于网络传输。
宽字节、多字节
- ANSI字符集所支持的就是多字节的也叫窄字节,类型来说就对应char类型。1 char = 1 byte 。
- Unicode字符集也叫宽字符集,所支持的就是宽字符集,从类型上来说就是 wchar_t类型。从上面的Unicode介绍中可以知道,wchar_t = 2 char。
在MFC中,ANSI字符集 所支持的就是多字节的也叫窄字节,类型来说就对应char类型。 Unicode字符集 也叫宽字符集
所支持的就是宽字符集,从类型上来说就是 wchar_t类型。
为了方便在不同的字符集上转换,就有了一种TCHAR类型,TCHAR能随着窄宽字节的变化自动变化。CString也是这样的。我们在定义CString的时候就需要使用的宏_T(“值”)或者TEXT(“值”)来表示文字了,这两个宏也是随编码不同,自动把里面的值转换成对应的编码。
- 推荐一篇博客:多字节与宽字节的区别
类型 | 解释 |
---|---|
char | 多字节字符,一个char占一个字节 |
wchar_t | 宽字符,一个wchar_t占2个字节 |
LPSTR | char* 也就是char的指针 |
LPCSTR | const char* 也就是一个限定不会被改变的char指针 |
LPWSTR | wchar_t* |
LPCWSTR | const wchar_t* |
LPTSTR | TCHAR* |
LPCTSTR | const TCHAR* |