Fist:why?
有时候只知道什么还不够,我们还需要为什么,所以我在整个数据结构系列中都要追寻这个答案。
Q1:为什么需要字符型数据结构。
还是回溯到计算机出生的时候,那个时候,编程使用的是机器码,但是我们知道机器码是很长的,而且很抽象都是0和1难以记忆。所以自然就想到了,将英文字母引入计算机。这样不仅仅编程更加方便。而且,计算机的作用也能延伸到仅仅计算之外。
Char是如何使用二进制实现的
1。编码与char类型
我们常常听到ascll、GBK、utf等等,这些编码格式。那么编码是什么呢?
把像a、b、c、d这样的52个字母(包括大写)以及0、1、2、3等数字还有一些常用的符号(例如*、#、@等),用二进制表示。
哪些二进制数字表示哪个符号,需要约定一套规则,这个过程就叫编码
而char类型就是这样的二进制数字,不过由于不同编码格式规定的位数,编码不同。所以同一个char的编码也不一样。一般的程序语言都会默认一种编码格式。一般是ascll,因为这种编码格式占的位数少。
2.常见的编码格式
我们常见的编码格式大概有5种包括,ASCII、GB2312、GBK、UTF-8、UTF-16
1、ASCII
编码应该是最为人熟知的,多数编程语言都支持的。
2、GB2312
主要是汉字编码,双字节编码,总的编码范围是A1-F7,其中从A1-A9是符号区,总共包含682个符号,从B0-F7是汉字区,包含6763个汉字。应用不多。
3、GBK
它的出现是为了扩展GB2312,加入更多的汉字,它的编码范围是8140~FEFE(去掉XX7F)总共有23940个码位,它能表示21003个汉字,它的编码是和GB2312兼容的,也就是说用GB2312编码的汉字可以用GBK来解码,并且不会有乱码。
5、UTF-8
UTF-16统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的今天,这样会增大网络传输的流量,而且也没必要。而UTF-8采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以是由1~6个字节组成。
4、UTF-16
具体定义了Unicode字符在计算机中存取方法。UTF-16用两个字节来表示Unicode转化格式,这个是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是16个bit,所以叫UTF-16。UTF-16表示字符非常方便,每两个字节表示一个字符。
3.不同编程语言的内存编码格式(默认||常用)
C
在C语言中字符有两种,一种是窄字符,另一种是宽字符。
只有 char 类型的窄字符才使用 ASCII 编码
char 类型的窄字符串、宽字符和宽字符串都不使用 ASCII 编码,一般根据编译器设置编码格式,大多数为UTF-8
C++
C++分为char、wchar_t
char表示汉字用双字节,字符用单字节,汉字编码格式为GBK,字符为ASCII。
wchar_t字符,用的是unicode编码,utf16
JAVA
JAVA内存编码格式采用,UTF-16BE大端序编码方式。
Python
Python通常默认时使用utf8编码方式
Go
string是所有8位字节的字符串的集合,通常,但不一定表示UTF-8编码的文本。字符串可以为空,但不能为nil。字符串类型的值是不可变的。
一种是 uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。
另一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。
3.程序怎么知道这个字符串是什么编码的?
不同的编码产生的二进制也不同,文本文件将编码格式放在文件头部。
例如:
编码格式 | 格式定义 |
---|---|
ACSII: | 无格式定义 |
Unicode | 前两个字节为FFFE |
Unicode big endian | 前两字节为FEFF |
UTF-8 | 前两字节为EFBB |
4.字符是怎么输入、输出的。
字符型的输入主要通过键盘间接输入或者程序生成字符码值来的,通过键盘的不同输入值,系统输入程序,调用键盘输入接口。根据输入的值来间接输入。
而输出的则是两种一种是直接输入到文件,另一种是通过显示器的主控芯片将之前已经固定的字符位图输出。