当前位置 : 主页 > 编程语言 > java >

java源码解析之charset(一)

来源:互联网 收集:自由互联 发布时间:2022-07-07
虽然学习的路很波折,但是仍然要哭着进步。。。 其实总体来说学习不是一件枯燥的事,尤其是当学习自己所感兴趣的东西的时候,但是难免要忍受一些在享乐时所不用理会的煎熬。。


    虽然学习的路很波折,但是仍然要哭着进步。。。  其实总体来说学习不是一件枯燥的事,尤其是当学习自己所感兴趣的东西的时候,但是难免要忍受一些在享乐时所不用理会的煎熬。。    甚至有时候这些煎熬是十分痛苦的。  所以我在心中有一个奇怪的想法:那就是  哭着进步!

    输出一番心情后,接着进入正题。 

    按照计划,本周应该查看的是charset的源码。 先上图:

java源码解析之charset(一)_子类

    依然是,这里并没有贴出所有的依赖以及展现所有的继承关系,否则这里将会是密密麻麻的一片灾区。。   这里挑了一些比较重要的,或者在逻辑实现的时候担当了不可或缺作用的类或者接口。 

    接着依然是记录自己按照时间间隙所记录的问题吧:  首当其冲的是charset,从图中也能看出来:

java源码解析之charset(一)_字符编码_02

    这个其实就是用自己蹩脚的英语去翻译了一下官方的权威注释,不一定准确,但一定能有所感悟,尽管这些感悟也不一定正确,但是从哲学上讲它是一种进步。。  事实上如果将自己比喻成小说里武侠的人物话,编码的经验与能力则是所处的等级,而对于修炼的感悟,则是一种潜力。  有很多的感触后面再谈,这里继续:

java源码解析之charset(一)_二级缓存_03

    这里处理了我长久来的疑惑,在众多的场合中,为什么我们有时候用utf8,有时候又是用 utf-8,有时候是UTF-8,或者UTF8.   有心者可能会有这样的思考:  在什么场景下这些可以通用,在什么场景下这些可能会报错,为什么它们可以这样用,那么上面的权威说明很好的解释了这些问题。 需要注意它的标准字符名称都是全大写,并且这个不是java说的,这个是那些个国际组织说的。 

java源码解析之charset(一)_字符编码_04

    这里便已经接触到我们开发中常见的一些编码,并且配有官方权威说明,注意开发中我们不是用编码字符集,而是编码。  二者有着本质的不同。 

java源码解析之charset(一)_二级缓存_05

    由于自己的英语问题,有一些地方除了错,比如讲翻译 翻译成了打断,不过好像总体来看还是能看懂的哈哈哈。

java源码解析之charset(一)_二级缓存_06

    这里有两点记录我认为十分重要,其重要性甚至超过语言本身。  一: 对于超过一个字节的流中,会存在大小端一说,相关的解释详细可百度。   二: 一个字符编码集就是一个抽象字符集与数字集的映射,如: ascii编码集,iso编码集,unicode编码集。  这也是后面很多的编码中都需要借助数字来进行相应的逻辑实现。     这里注意图片中的又有些误区:那就是讲编码集写成了编码.继续:

java源码解析之charset(一)_字符编码_07

    当时看的时候,在这里就特地查了查unicode与utf系列的区别。  是十分必要的。  在知乎上看到的解释那是真的棒。  但是我始终认为自己写的才是自己的(其实学习的本质是传承,如果没有传承,那么整个人类的文明程度将会限制在一个十分狭窄的,可预估的区间内),尽管有很多错误与不足,但是敝帚自珍嘛,没有小菜鸟,哪来的大牛呢。 继续:

java源码解析之charset(一)_子类_08

    这里有两个地方需要注意: 编码依赖于字符编码集,这里出现了两个编码,它们的区别在于,前者是动词,后者是名词(咋这么熟悉呢??  想起来了,不就是依赖注入中的依赖  为名词,而非动词),看来中华文化博大精深,单词的表意性很强。  二:java编程语言的原生字符编码集是utf-16,在上面的时候了解到,jvm的编码会根据底层操作系统而确定。   所以本身不矛盾。 

java源码解析之charset(一)_字符编码_09

    这里由于看到了万国码的概念和它的一些属性,进行了一些学习上的联想。  因为鄙人以前一直认为语音识别是一个十分高大上的东西,至少对于人类来说确实比较高大上。  但是对计算机来说就有点不够看了。 

java源码解析之charset(一)_子类_10

    不知不觉它们的说明已经看完了,这里是对它内部的一些主要方法的查看。 逻辑都很清晰便没有什么记录。 

java源码解析之charset(一)_子类_11

    这里比较经典的有一个二级缓存的实现,其逻辑可以类比到系统中,我想对学习还是有一点帮助的。 

java源码解析之charset(一)_二级缓存_12

    这里其实是有点神经大条了,因为对整个类的外围关系不是很清楚,当时以为会跟Thread有一个很强的耦合性,特意进行了分析。  但是后面发现它们并不存在耦合关系,毕竟水平有限,当某一天成为了真大牛后,可能会有一个很透彻的认识。 

java源码解析之charset(一)_子类_13

    这里是结合上上个二级缓存,它的具体的实现相关的逻辑。 

java源码解析之charset(一)_字符编码_14

    这里的记录有些问题,主要是没有将编码与字符编码集的区别搞清楚。  将就着看吧。 

java源码解析之charset(一)_字符编码_15

    这里是它的一个构造方法。  可以知道这个charset是针对编码的,而非字符编码字符集。  因为在有道词典上输入charset,可以看到中文注释有:  字符,编码。   这就有些迷惑了。 

    好了自此关于charset记录的所有问题都写写下。 在进行其它类的记录前,插播一下自己的感触就是:   何谓编码?何谓编程?   编程是基于编码的,或者说在更高的层面进行编码。 编程离我们很近,但是编码离我们更近。  脱离开了编码,便没有编程可言。    其实也很容易想明白,编码是将二进制与自然界的实体:  声(声音传输简直不要太频繁),光(图片,文字,视频所有我们在计算机可见的内容),电(高低电平),力(这个不知道有没有),热(跟光有一些关系).它们的本质是能量,也就是编码将二进制与能量联系起来了。   而编程则是将人类与二进制联系起来,二进制在中间做了一个中介者,将我们与能量联系起来了。   从这里可以看出,编码并非是要与计算机通话,我们的本质是与能量通话。    这就是我在Youtube看到的大牛所说过的: Code everything的含义吧!

    瞎扯结束,继续:

java源码解析之charset(一)_字符编码_16

    接下来是其子类:FastCharsetProvider

        

java源码解析之charset(一)_子类_17

    关于这个类的感想都在图中,接下来是其子类:StandardCharset

java源码解析之charset(一)_二级缓存_18

    可以看到它们有很多很多的别名,所以我们我们充其量用了下大小写,远远不要感到奇怪。

java源码解析之charset(一)_字符编码_19

    这是它内部的一个实现方式,应该是代理模式吧,oop原则是依赖倒置原则。 错了就算了吧,因为有一些原则跟设计模式本身就不好区分,而且有一些甚至是某种程度的细化。 

java源码解析之charset(一)_子类_20

    可以看到该体系分为三个层级,抽象层,抽象实现层,具体细化层。   给它贴一个装饰模式吧。

    关于结构这些基本就这些,下一篇具体看相关的编码实现类。    

 

 

上一篇:java源码解析之charset(二)
下一篇:没有了
网友评论