00:00
行,那么接下来呢,咱们给大家把这个字符集呢说一下,以前呢,咱们其实零零散散呢,这个藏着也好,掖着也好,其实也已经说过一下这个磁符机的问题了,咱们在这个呃,一开始在设置eclipse的时候,在设置idea的时候,咱们呢,都让大家呢去改过,这个叫字符集啊,其实准确的说呢,是编码集或者解码集啊,编码解码的一种方式,咱们在前面讲string的时候啊,包括现在呢,我们讲这个转换流的时候,都会涉及到这个叫字符集啊,因为会有编码和解码的过程,那我们先来了解一下常见的这个字符集都有哪些。啊,这呢提到叫编码表啊,这个编码表的一个由来啊,说计算机呢,只能识别二进制,早期呢来自于电信号,说为了方便呢应用计算机使它呢可以识别各个国家文字,这呢我们就得拿个数字去来表示这个文字有一个一一对应关系啊,就形成一张表,这呢就叫做编码表。
01:01
这很简单,然后常见的编码表有哪些?这儿呢,首先提到了这样的几个标准。啊,这呢我就先粘过来啊,这呢首先叫啊ask这个A后边是两个I啊这个是要美国标准化信息交换码,哎,它呢是占一个字节,但是这个字节我们说有八位啊八位呢,它其实有一位没有用。只用了这个七位,七位呢,就只能表示128个数啊,128个情况吧。哎,那对于美国来讲呢,他这个用asking呢,它就够用。因为人家那是个拼音文字。就abcd啥的这个大小写26个,那你26个乘以二,就26个乘以二,那不就52个嘛,加上一个标点符号128,对于他来讲还还富余呢,是吧?啊,但是对于咱们中文来讲呢,显然不够啊,他这个中文的汉字呢,那太多了。啊,这呢是美国用的,他就用就挺嗨的啊呃,结果呢,后来这个呃,计算机呢,就扩展到这个欧洲了,扩展到这个亚洲了,这个这个大洋洲了等等,发现别的国家呢不爽了是吧,现在阿克阿K这个码呢,光他美国这样的一些字符能够识别,别的国家识别不了了,所以各个国家呢,陆陆续续就开始组建自己的这种啊,这叫字符级。
02:19
啊,或者叫编码表了,这个ISO8859杠幺,那这个呢,叫拉丁码表,或者叫欧洲的一个码表,它是用一个自己的八位来表示的。嗯,然后对于咱们这个中国来讲呢,一开始呢,叫GB2312,诶GB2312这个中文的一个编码表,就相当于咱们把这个中文的这个每一个汉字都会对应着一个具体的二一个数,这个数的话呢,那你二进制呢,就用二进制来表示就行,那底层呢,如果你看到这个二进制的这个数啊,就能够翻译回来是中文的哪个数了啊,那么对于咱们这个中文的这边2312来讲,它是用两个字节来表示的。
03:02
但这块我写的是最多两个字节。就是说呢,也有一个的情况,那就是说咱们GB2312和GBK啊,这个包括大家你看这个这个咱们打开其他格式的时候,你会发现这个中文会乱,但是英文从来不乱。啊,因为呢,像我们的UTF杠八也好,GBK也好,GB2312也好,它兼容了我们这个SK的这个码,在SK这个码当中,97代表的就是小A,其实用一个字节就够,那在我们这个JBK啊,这个JB2312当中,包括UTF杠八当中这一个小A呢,还让它是97,还用一个字节来表示。好处是什么呀?节省空间呗,对吧,节省空间了啊,你像原来这个小A971个字节就够,那你要用俩字节,前面这不都是零吗,不浪费一个字节吗。所以呢,我们就哎兼容一下你前面这些,哎,所以这个最多两个呢,就是中文的话呢,是用的俩,但是呢,你要是abcd这些还是用的一个字节啊是这样的,那么JPK相较于GB2312呢,是它的一个升级版,融合了更多的中文的文字符号,比如说呢,这里边是包含简体繁体都有的。
04:15
啊,就包含了更多的这个中文汉字了,它也是最多两个字节来表示。啊,最多两个字节来表示,那这呢会涉及到问题哈,大家想我现在底层。这呢我表示的是一个字节,这呢表示的也是一个字节,那问大家你会不会有这样的困惑啊,你说我这个呢,假设是用这个JBK或者是GB2312啊啊来存的就是底层,大家看这个这个硬盘当中啊有一个文件,这呢就一堆0101,这呢是一个字节,这个字节你说。这是代表两个。字符还是说呢,整体作为一个字符出现,是不是会有这样的一个困惑?
05:00
哎,听懂这意思了吧,两个字就是咱们说不是最多有两个字节吗?YIG呢,就是我遇到一个底层,这呢确实俩字节,你说这俩字节呢,表示的是两个字符还是呢,合起来是一个字符,是不是会有这样的一个啊,直接一个了,你要是代表一个的话呢,那你就相当于认为每一个字符是不是都占两了啊,但咱们刚才不是说了,说这个abcd这些呢,它其实占一个嘛。就有可能会有这种情况,比如说这个呢,呃,如果你要把它看成是一一个的,嗯,它独立这一个字节就够的话呢,假设它就是小A,这个你看就是小B啊,你要看这个底层不就是97这个数吗?这可能就是98这个数了。它有可能是两个分别各自表示一个,这就是小A小B,但是是不是你也有可能说是不是你整个合一起表示的是一个汉字呀,啊这说明白了是吧,有这样的一个问题哈,那他得想办法解决这个事儿,他呢,怎么解决的呢?他就看这个守卫。
06:03
哎,看首位,首位呢,我就换了啊,这里有两,这两个到底合起来表示的是一个字符还是说呢,分别代表着两个字符,首位如果是零。哎,那就表示我这个呢,就这一个啊,这一个一个字节八位嘛,它就单独的表示一个字符了,你要这还是零那一样的道理,哎,整个它就表示一个字符了,那如果说你这个,呃,最高位呢,是一。我是一就代表着,诶它呢,这一个字节不够哈,我身上拿两个字节来表示的是一个字符。这个问题就解决了。能理解是吧。能理解吧,啊能理解啊,这呢就是针对于他俩来说的啊,针对于他俩来说的啊,那下边呢,那这个就是首先呢,这个问题就解决了啊,嗯,就是嗯,很好的解决了我们这个数据的一个存储问题,嗯,然后呢,接着我们往后说啊,这个unicode,这个unicode呢,嗯,咱们说呢,它是一个国际的标准码,首先为什么要引入它,是因为呢,我们这儿呢,是中文的,也有欧洲的,还有什么非洲的,这个世界上这个国家非常多,你不能一个国家整一个表,那如果我们万一一个文件当中有多个国家的语言文字,那你说用谁读啊,用这个读好这块不乱嘛,这块乱,再用这个读这块不乱了,这块乱,那看起来有点崩溃了。
07:36
说一个文件要想看明白,得转换好几种字符集了。啊说这个时候呢,讲说能不能啊,咱们这个世界上各个国家,咱们建一个呃超大的一个字符集,叫一个编码表,然后呢,把世界上呃现在能用到的所有这个语言,涉及到这个字符呢,全融进去,让所有的这个语言中呢,每一个字符都对应着一个二进制的数。
08:01
或者是不是二进制,哎,不是重要的啊,就是对应一个数值呗,计算机底层是二进制存的,那就把这个数值转换成二进制就可以了啊,哎,让把全世界的这个每一个字符呢,都对应着一个数。啊,那这时候呢,我们就提到了这样的一个啊叫unicode啊,叫国际标准码,融合了目前人类使用的所有字符,为每一个字符分配唯一的一个字符码,就是每一个数字呗。这样的啊,嗯,那么为世界上每一个这个语言的这个字数都分配一个数值,那最后呢,发现我俩字节就可以搞得定。两个字节就可以搞得定两个字节。两个字节,这是八位,这是八位是吧?这是八位,这是八位,然后呢,是二的多少次方呀,十六次方吧,一共呢,就这么多的情况,就是你把全世界这个文字都加起来,这个每一个字数都都算一个啊,都加起来也没超出来这么多,相当于咱们是不是,呃,你要是用UN扣的去表示这个数的话呢,用两次解就搞得定了。
09:10
哎,OK,这个能搞得定,但是呢,发现这个UN扣呀有问题。说运库有问题,有什么问题呢,这呢,咱们内存层面你去存这样的一个数没问题啊,是可以的,但是呢,具体我们存到这个,呃,底层这个文件当中的时候呢,就有事儿了,你看咱们这块呢,说到了说呢,我们用两个字节去存是吧,俩字节去存,嗯,就是你要是这个unicode是用俩字节存,那是不是又是这是一个,这是一个。这是一个,这是一个,那还是是不是会出现刚才咱们说的JBK一样的问题。你到底这两个。这两个呢,你表示的是整体上是作为一个字符呢,还是说呢,你这里边儿呢,是两个分别的字符恰好呢,这是就是阿斯格码里边不用一个字也就可以搞定嘛,哎,还是表示的是两个字符呢。
10:10
是不是刚才会出现跟他俩一样的问题啊,对那一样问题,大家可能会想,那跟它一样的处理不就完了吗?你这写零,那就表示呢,我只读一个,你写一,我就表示呢读俩。啊,想法很好,但是这样呢,对你是不是就相当于少了呀,你这原来是二的十六次方,你这一占用这个呢,不表示具体的一个数了一下就变成二的十五次方了。这个时候呢,不够用了。JPK呢?光是中文的还好,你世界上所有语言都加起来这个最高位,你还不想让它表示数,只是表示读一位还是读两个,读一个字节还是读两个字节,不够用了,那完了。那是不是就出事了,所以说呢,这个你看unicode在很长一段时间呢,都没有落地啊,你看我下边呢,写着这样的啊,说unicode呢,它不完美,它有三个问题,一个呢,我们已经知道说英文字母呢,只用一个字节就够了啊,那我们这个,呃,你说你用俩字节其实浪费了一个啊啊全是零没意义。第二个呢,就是我们怎么去区分的uniqueode话,Ask呢,就咱们刚才讲的,你那用俩字节,俩字节到底是表示两个字节,两个ask,两个字这个字符,还是说呢,你俩整起来合起来是一个字符。
11:29
有这个问题。啊,那第三个说如果呢,和GBK等双字节编码方式一样,说用最高位是零,呃一或零表示两个字节或者一个字节啊,又少了很多值,不够不够用,所以在很长一段时间呢,这个unicode呢,都没办法去推广,直到呢互联网的出现。呃,互联网出现以后提到了啊这样一个叫,呃,它这样的一个标准,这个简称呢叫utf啊utf就出现了,那UTF杠八还会看到叫杠16,杠八呢就是每八个位呢传输啊16呢就是每16个位呢去传输,就基本单位呢不太一样。
12:10
啊使得呢,我们这个就没有国界了,把这个世界上所有的文化的这个汉字呢,就都包含进来了啊这个下边呢,就是这样说这个先过了啊大家呢,光看这呢,可能还看不太明白,还是不知道他怎么解决的这个问题是吧?哎,我们下边呢,诶给大家说明一下这个到底里边是怎么做的啊。啊看到底怎么做的呢,看他这样做的,就首先说呢,咱们这个你用这个两位最高位呢,咱们是想用零或一表示呢,就是它到底是这一个还是占两个,嗯,那说了,你要是这块占用的话呢,一共是二点十五次方情况,不够用,不够用的话呢,我们可能就想整三个哈,咱不就想整三个嘛,就是那就再长一个呗,这呢肯定就够用了,但整三个的话呢,你怎么去区别你这个位置,我写零,好,那我就是这一个,我写一的话呢,是你想用两。
13:02
二进制除了零跟一没了,你说写个二,二进制哪有二啊,你说写个二啊,说我这三个算一个是吧,没有二啊,那没二不好整了,怎么办呢?他这么着想招了。嗯,对,这么着抢招的啊,就是呃,我们以UTF杠八为例啊,呃,咱们这个unicode它不对应个数嘛,我们用16进制来表示,那么这个范围的数。就相当于原来那个ask那个范围,咱们用一个字节就可以搞定。八位,那你要是用两个字节来存一个字符的话,我们这样写的,就大家呢,能够看到这个,呃,前面这个字节的开头呢,是110,这个110表示呢,就是我后边呢,除了读你这个之外呢,我再多读一个。啊是这样,那你要是读三个的话呢,我就1110,只要你看到这个1110开头的,哎表示了我后边呢是三个BAT当一充当一个字符。
14:08
哎,是这样子的啊,后边呢,还有这个就是四个的情况。哎,四个情况啊,咱们举一个例子。比如说哎,这个咱们上尾谷的上啊,这个上大家找这个unicode,它是一个编码表啊,哎,这个上呢,去那个表里边大表里边一找,说这个上呢,它对应着一个这个数,这个数呢就是23578。啊,23578,这个呢很容易的,我们会算出它的16进制和二进制,比如说我们这来一个叫计算器。啊,223578。23578换算成16进制就是5C1A。啊,咱们平时见到说unit刻的值,咱们在Java当中说占,这是对这呢是你这个存储的地址值啊呃,0X几几几几,这呢是不是都是16进值,就是内存当中来表示的啊嗯,行,那么这是它的16进制,那对应的二进制。
15:08
啊,对应的二进制呢,就长这个样子啊,你就看这一节。是不是就这个吗?跟它完全一样啊,行,这呢指的是咱们unode啊对应的这个数,那现在呢,这个数我们要给它存到底层的磁盘当中了,怎么去存,哎这呢,这个上相当于咱们这个中文,中文的话呢,在UTF杠八当中是三个字节,三个字节存一个啊就是一个汉字的话呢,用三个字节存的,那我们就相当于把这块那个数呢,得给它塞进去三个字节,这是不是就三个字节的情况。哎,那就是像那abcd的话呢,人家还是用这个就行啊,哎,就是你识别它就是abcd了,那当然咱们这个中文的话呢,这个我们就得用它了,哎用它呢这儿呢,先放四位,你就把这个0101就放到这儿呗。
16:04
所以你看这呢,是底层存在的一个情况啊,哎,先是1110啊,这是它,然后呢,这是0101,这就放这了,好再是幺零开头的,幺零开头呢,你在后边去C这是六位了,那就是110000。啊,110000啊,再C10啊,这个幺零放这。哎,然后后边呢,是不是还差这个六位嘛,零幺啊1010啊,011010,相当于我们把这个,诶内存中的这个上,它对应的这个二进制这个呢,给它截成三部分,塞到我们这块这个叉的位置了,回头呢底层,哎我们再去读的时候呢,只要你看到这个是1110开头的,好,那我就知道了,我把这段内容,这段内容,这段内容这是三个字节,把这个叉叉叉这些拼一起,我就能给你拼出来一个,这个是这个数数呢,还就是上啊是这样的。
17:00
啊是这样子的啊啊,那么原来的时候呢,其实我们说这个U杠八啊,他呢最多三个字节就行,后来呢,说又提供了,说也有可能呢是四个字节了,那就可能融进来更多的内容了,下边呢,这是一个,呃,这个这个诶我从这个百度知道里边这个拿过来的啊这是一个新的一种变化啊,大家呢,你可能会看到去网上去找的时候呢,你找了u tr杠八,它可能会写说叫变长的编码方式。这个应该理解哈,咱们刚才这边提到说有可能是一个字节,有可能俩人,可能仨,说还可能四个,你要去网上找,有时候呢,你会看到不同的帖子啊,或者这个,呃,不同的位置写的不一样啊,有的位置写呢,说最多使用三个字节来表示这个字符,有的人写说可以用一到四个,还有人写的一到六个字节,这到底是几个?哎,这呢有一个标准的变化啊,那这我写的说在这个标准的utl杠八编码当中啊,超出基本的多语言的这个范畴的话呢,哎,我们就把它用四个字节来表示了啊,那后续这个修正的时候呢,呃,这块呢,它又有可能用六个字节,这是最新的啊。
18:09
说呢,在UTL杠八当中,是有可能用六个字节来表示一个字符的,那就容易呢就更多了啊这个说的是不是稍微有点难度是吧?但是整个呢,对大家要求呢,就是一个了解的啊,就是呃,你能清楚回头呢,万一别人跟你去聊到这的时候呢,你能够说出来,说明你还是看的挺深的,而不是只是说呢啊我们写就ul杠八,至于说U杠八跟unio的什么关系,这都不知道,嗯,就是稍微有点薄是吧?诶你再看我们这块统一说一下啊呃,整个呢,计算机只是0101,然后呢,我们表示一个字符提到了美国的叫SK这个编码方式啊,这个呢只适合于美国,别的国家不适合,所以呢,又会出现了好多各个国家适用的一些字符集啊,这呢都是符合叫an SI这个标准的啊na SI美国叫美国国家标准学会啊,它制定的一些这个标准啊,就是都是符合这个标准的,这里边呢,就提到了很多这个呃编码表了。
19:09
啊啊,这个在英文系统当中,就是它在咱们这个中文系统当中,默认的就是JBK。啊,就相当于如果我这有个文件啊,我这呢使用它打开这个文件的话呢,我这个位置我选一个转为NSN,其实它本身现在就是哈,我先转为它,哎,那么在咱们这个中文的操作系统下,我变成了它,它其实就是代表的叫JDK。啊,它就代表JK,因为你看这也没有JBK啊,它其实就是。好好关了,那么再接下来呢,提到一个叫unicode,但是unicode呢,它只是一个字符集,这个字符集呢,规定了一个字符跟它对应的一个编码,但是真正落地我们往这个引流的方式去存的时候,包括在读的时候,底层我们到底怎么去取,是呃这一个字符,呃一个字节就是一个字符,还是说呢,两个是,还是说三个是,这不咱们说它存在的问题吗?诶所以我们具体落地的话呢,呃,Uniq的它的编码实现啊,提到了UTF杠八杠16,杠32,这就是几个一位去读的这个区别而已啊,那咱们呢,平时用的话呢,UTF杠八杠16,其实都可以这样用的多一些啊,那咱们呢,相当于指定的是UTF杠八。
20:26
啊,就是告诉我们底层这个去解析的时候呢,识别前面这个码,你就知道了到底是几个独一位,然后传成一个字符了。啊是这样的过程啊行呃,那么关于我们这里边说的这个叫嗯,这个转换流,借着这个呢,我们把这个磁幅集呢,给大家就是讲了讲啊以前呢没有讲透啊,就是这会儿呢,我们把这个就说清楚它啊。
我来说两句