字符集及字符编码扫盲

概念区分

字符集:

    一本大字典、老大老大的一本字典

字符:

    字典里的字(可以是 各国文字...  数字 字母 标点符号 图形符号 特殊符号...)

字节:

    文件的长度(或者说大小)的单位

    这里可以理解为:字符经过了字符编码后,变成了0和1组成的长串串,那么这个长串串到底多长? 1字节 = 8bit

字符编码:

    把字符集中的字符 编译 成计算机能识别的二进制数(0 和 1)的这么一种规则

总结:

    字符 和 二进制 如何进行一一对应 , 取决于不同的字符编码

乱码问题

你自己都能创造一个字符编码规则, 我就规定 A 的 二进制 是 1, B的二进制 是 0 , 你能把我怎么样??? 可以, 允许.

问题是

你用你的编码规则 保存完文件,  把文件传给别人,别人用自己的电脑打开, 他不用你的字符编码规则就根本还原不了文件内容

乱码问题就是这个道理

XX字符编码 把 ”中“ 这个字符 编成了(假设) 0000 0001 ,然后 别人用 OO字符编码的文件编辑器打开,

乱码问题就出在此时

1: 可能 OO字符编码规则里 根本就没有 0000 0001 这个么东西, 人家不认识

2: 可能 OO字符编码规则里 0000 0001 表示的字符是 “国” , 因为 XX 和 OO 是 2种 字符编码, 不兼容

3: 可能 OO字符编码规则里 不是用 8位 表示一个字符, 而是 4位 表示一个字符

    0000 00001 会被误解为 0000 和 0001 2个字符 ,解出来 可能是 “傻逼” 2个字

所以不论平时 写文档还是敲代码 ,都要统一好字符编码.

由问题引出的字符编码

一个文件里的内容: ABC123

问: 这个文件有6个字符, 那么有多少个字节?

答案: 6 、9 、12 、14、 24、 28 

ps: 你只需要知道 这个问题就是个傻逼问题即可, 你必须把 所有的字符编码 都代入算一遍才能 回答出完整的答案!

不谈字符编码你让我回答NM呢?

ASCII码

标准ASCII码

American standard code for information interchange : 美国标准信息互换码

美国国家标准学会 1967年定案 

被 国际标准化组织(ISO) 定为 国际标准 ,称为 ISO 646标准.

适用于 所有 拉丁文字字母

按照十进制来说, ascii码 一共能编码 128个字符(0 ~ 127) 用 7bit 表示 , 即 2的7次方 = 128

足够保存美国所有的文化符号

0 ~ 31 非打印字符(回车符、换行符、制表符......)

48 ~ 57 数字 0-9

65 ~ 90 大写字母 A-Z

97 ~ 122 小写字母 a-z

扩展ASCII码

IBM公司进行了扩展, 因为很明显 128个不够用啊

用 8bit 表示 即 2的8次方 = 256个字符

其中 0 ~ 127 和从前一样保持不变, 最高位补0

新的 128 ~ 255 最高位用1表示

这就是 为了解决兼容性

总结

ASCII码是用几位二进制数表示的? 答案 : 7 或 8

ps: 同样的傻逼问题, 你不说 哪种 ascii码 老子怎么知道???

GBK字符集

GB2312字符集

1980年 中国国家标准总局发布

GB: 国标

2312: 申请字符集标准的时候排在了2312号

是对ASCII码的扩展

1: 只支持 6763 个汉字(太少了,根本不够用)

2: 0~127 不变 1个字符 》 1个字节

3: 128 ~ 最后 都是 1个字符 》 双字节

4: 0 ~ 127 中 大小写英文、数字、标点符号 称为 半角

    GB2312重新编了一套双字节的  大小写英文、数字、标点符号 称为 全角

    半角 : 1个字节  全角 : 2个字节

    半角 和 全角 只针对 字母、数字、标点符号

    中文是无所谓全角半角的

GB13000字符集

也称为 GBK 编码

1993年 颁布了《汉字编码扩展规范》即 GBK编码

包含了GB2312的所有内容, 并扩展了近20000个汉字(包括繁体)和符号

GB18030字符集

2000年

又增加了 几千个 少数民族文字

是 GBK 的取代版本

在GBK基础上 增加了CJK(China-Japan-Korea 中日韩) 统一汉字扩充的汉字

DBCS字符集

 GB2312、GBK、GB8030等一系列汉字编码

中国程序员 统称为 DBCS(double byte character set 双字节字符集)

特点是: 除了 ASCII码是单字节外,其余全部是双字节

总结:

中文字符集是几个字节的?

答案: 单 + 双

Unicode字符集

UCS、统一字符集、万国码、单一码

ISO(国际标准化组织) 1990研发   、 1994发布(我出生那年)

万国码——全球化——不同语言的兼容

1: 不管是不是ASCII码, 必须是 双字节

    0 ~ 65535 = 65536 (还是不能表示所有的汉字)

    ISO准备了UCS-4方案, 4个字节表示一个字符,能保存42亿个字符(这回够了)

2: ASCII码 原来的低8位不变, 多出来的高8位用0填充

3: 中文字符 共 20902 个, 从 19968 ~ 40869

    十六机制 \u4E00 ~ \u9FA5 (正则表达式常用)

4: unicode在制定的时候没有考虑与任何一种现有的编码方式兼容

    (这是对的, 毕竟国际组织, 兼容哪个国家的都不合适, 索性都别兼容)

总结:

unicode 和 gbk 的区别?

答案: unicode 全是双字节 、 gbk 除了 ASCII码单字节, 其余全是双字节

UTF系列编码

UTF系列编码是Unicode字符集的编码方式

unicode中的ascii码 用2字节(16位)其实非常浪费

因为 英文 数字 啥的非常的 常用啊, 其实白白浪费了那8bit

UTF-8、UTF-16、UTF-32都是处理Unicode字符集的,只是规则不同

UTF-16

所有Unicode字符全部都是 2个字节

这样基本完全还原了Unicode字符集,他俩你可以等同看待

字符 和 字节 的转换更简单

编码效率最高

进行字符串操作也更好

适合 本地磁盘和内存之间进行字符和字节快速切换

不适合 网络传输, 浪费空间,容易损坏字节流

UTF-8

比UTF-16的解码更复杂, 是可变字节编码

Unicode中:

    0 ~ 127 = 128                    1字节(ASCII码)

    128 ~ 2047 = 2的11次方    2字节

    2048 ~ 最后                       3字节(Unicode中文开始是19968, 所以中文在UTF-8中都是3字节)

文本一个字节一个字节来读取,再根据字节开头的bit标志位来识别,

最后确定这是几个字节代表的一个字符(具体规则 你没必要懂, 有需要的自己查一下吧)

适合 网络传输  

总结:

UTF-8和UTF-16的比较

1: ascii字符是 1字节, 常用,省流,速度快

2: 单个字符损坏不影响后面的其他字符, 安全性好

3: 编码效率 GBK < UTF-8 < UTF-16 , 比较不错

UTF-8 with BOM

BOM: byte order mark  字节序列标记

就是用标志位 来 标志 文件内容编码为 UTF-8  以 EF BB BF 开头的字节流

UTF-8编码中的 BOM 占 3个字节

所以 : 为什么同样都是 UTF-8编码 , 两个文件 大小 可能 差了 3字节?

UTF-16 with BOM

开头 字节流 加上 FF FE

UTF-16中的 BOM 占 2个字节

ANSI编码

是一种字符编码标准,其实就是各个国家或地区的国标

对于中国地区就是GB2312编码, 美国 就是 ASCII码

Windows操作系统中的笔记本, 默认保存的编码就是 ANSI

ISO-8859-1字符集

标准ASCII码只有128个字符, 显然不够用

于是在此基础上 又拓展了一系列标准 ISO-8859-1~ ISO-8859-15

其中  ISO-8859-1 涵盖了大多数的西欧语言文字,应用最广泛

ISO-8859-1仍然是 单字节编码  总共 256个字符

Linux操作系统 默认编码就是 ISO-8859-1 , win32操作系统的机器默认是 GB2312编码

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值