概念区分
字符集:
一本大字典、老大老大的一本字典
字符:
字典里的字(可以是 各国文字... 数字 字母 标点符号 图形符号 特殊符号...)
字节:
文件的长度(或者说大小)的单位
这里可以理解为:字符经过了字符编码后,变成了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编码