【数据结构】ascll码与编码类型,字符char型如何实现。

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.字符是怎么输入、输出的。

字符型的输入主要通过键盘间接输入或者程序生成字符码值来的,通过键盘的不同输入值,系统输入程序,调用键盘输入接口。根据输入的值来间接输入。
而输出的则是两种一种是直接输入到文件,另一种是通过显示器的主控芯片将之前已经固定的字符位图输出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值