Skip to content

Commit

Permalink
增加时间与编码相关知识点
Browse files Browse the repository at this point in the history
  • Loading branch information
hollis.zhl committed Feb 29, 2020
1 parent 9cc1409 commit f0919b0
Show file tree
Hide file tree
Showing 13 changed files with 136 additions and 6 deletions.
16 changes: 10 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -229,9 +229,9 @@ finally和return的执行顺序

#### 时间处理

时区冬令时和夏令时时间戳Java中时间API
[时区](/basics/java-basic/time-zone.md)、[冬令时和夏令时](/basics/java-basic/StandardTime-vs-daylightSavingTime.md)、[时间戳](/basics/java-basic/timestamp.md)Java中时间API

格林威治时间CET,UTC,GMT,CST几种常见时间的含义和关系
[格林威治时间](/basics/java-basic/GMT.md)、[CET,UTC,GMT,CST几种常见时间的含义和关系](/basics/java-basic/CET-UTC-GMT-CST.md)

[SimpleDateFormat的线程安全性问题](/basics/java-basic/simpledateformat-thread-safe.md)

Expand All @@ -241,13 +241,17 @@ Java 8中的时间处理

#### 编码方式

Unicode有了Unicode为啥还需要UTF-8
什么是ASCII

GBKGB2312GB18030之间的区别
[Unicode](/basics/java-basic/UNICODE.md)、[有了Unicode为啥还需要UTF-8](/basics/java-basic/why-utf8.md)

UTF8UTF16UTF32区别
[UTF8UTF16UTF32区别](/basics/java-basic/UTF8-UTF16-UTF32.md)

URL编解码Big Endian和Little Endian
有了UTF8为什么还需要GBK

[GBKGB2312GB18030之间的区别](/basics/java-basic/gbk-gb2312-gb18030.md)

[URL编解码](/basics/java-basic/url-encode.md)、[Big Endian和Little Endian](/basics/java-basic/big-endian-vs-little-endian.md)

如何解决乱码问题

Expand Down
20 changes: 20 additions & 0 deletions basics/java-basic/CET-UTC-GMT-CST.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
### CET
欧洲中部时间英語Central European TimeCET是比世界标准时间UTC早一个小时的时区名称之一它被大部分欧洲国家和部分北非国家采用冬季时间为UTC+1夏季欧洲夏令时为UTC+2


### UTC
协调世界时又称世界标准时间或世界协调时间简称UTC从英文Coordinated Universal Time”/法文Temps Universel Cordonné而来台湾采用CNS 7648资料元及交换格式资讯交换日期及时间的表示法》(与ISO 8601类似称之为世界统一时间中国大陆采用ISO 8601-1988的国标数据元和交换格式信息交换日期和时间表示法》(GB/T 7408中称之为国际协调时间协调世界时是以原子时秒长为基础在时刻上尽量接近于世界时的一种时间计量系统

### GMT
格林尼治标准时间旧译格林尼治平均时间或格林威治标准时间英语Greenwich Mean TimeGMT是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间因为本初子午线被定义在通过那里的经线


### CST
北京时间China Standard Time又名中国标准时间是中国的标准时间在时区划分上属东八区比协调世界时早8小时记为UTC+8与中华民国国家标准时间旧称中原标准时间”)、香港时间和澳门时间和相同當格林威治時間為凌晨0:00中國標準時間剛好為上午8:00


### 关系

CET=UTC/GMT + 1小时
CST=UTC/GMT +8 小时
CST=CET+9
7 changes: 7 additions & 0 deletions basics/java-basic/GMT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
格林尼治平时英语Greenwich Mean TimeGMT是指位于英国伦敦郊区的皇家格林尼治天文台当地的平太阳时因为本初子午线被定义为通过那里的经线

自1924年2月5日开始格林尼治天文台负责每隔一小时向全世界发放调时信息

格林尼治平时的正午是指当平太阳横穿格林尼治子午线时也就是在格林尼治上空最高点时的时间由于地球每天的自转是有些不规则的而且正在缓慢减速因此格林尼治平时基于天文观测本身的缺陷已经被原子钟报时的协调世界时UTC所取代

一般使用GMT+8表示中国的时间是因为中国位于东八区时间上比格林威治时间快8个小时
9 changes: 9 additions & 0 deletions basics/java-basic/StandardTime-vs-daylightSavingTime.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
夏令时冬令时的出现是为了充分利用夏天的日照所以时钟要往前拨快一小时冬天再把表往回拨一小时其中夏令时从3月第二个周日持续到11月第一个周日

冬令时
北京和洛杉矶时差16
北京和纽约时差13

夏令时
北京和洛杉矶时差12
北京和纽约时差15
11 changes: 11 additions & 0 deletions basics/java-basic/UNICODE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
ASCII码只有256个字符美国人倒是没啥问题了他们用到的字符几乎都包括了但是世界上不只有美国程序员啊所以需要一种更加全面的字符集

Unicode中文万国码国际码统一码单一码是计算机科学领域里的一项业界标准它对世界上大部分的文字系统进行了整理编码使得计算机可以用更为简单的方式来呈现和处理文字

Unicode伴随着通用字符集的标准而发展同时也以书本的形式对外发表Unicode至今仍在不断增修每个新版本都加入更多新的字符目前最新的版本为2018年6月5日公布的11.0.0已经收录超过13万个字符第十万个字符在2005年获采纳)。Unicode涵盖的数据除了视觉上的字形编码方法标准的字符编码外还包含了字符特性如大小写字母

Unicode发展由非营利机构统一码联盟负责该机构致力于让Unicode方案取代既有的字符编码方案因为既有的方案往往空间非常有限亦不适用于多语环境

Unicode备受认可并广泛地应用于计算机软件的国际化与本地化过程有很多新科技如可扩展置标语言Extensible Markup Language简称XML)、Java编程语言以及现代的操作系统都采用Unicode编码

Unicode可以表示中文
9 changes: 9 additions & 0 deletions basics/java-basic/UTF8-UTF16-UTF32.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Unicode 是容纳世界所有文字符号的国际标准编码使用四个字节为每个字符编码

UTF 是英文 Unicode Transformation Format 的缩写意为把 Unicode 字符转换为某种格式UTF 系列编码方案UTF-8UTF-16UTF-32均是由 Unicode 编码方案衍变而来以适应不同的数据存储或传递它们都可以完全表示 Unicode 标准中的所有字符目前这些衍变方案中 UTF-8 被广泛使用 UTF-16 UTF-32 则很少被使用

UTF-8 使用一至四个字节为每个字符编码其中大部分汉字采用三个字节编码少量不常用汉字采用四个字节编码因为 UTF-8 是可变长度的编码方式相对于 Unicode 编码可以减少存储占用的空间所以被广泛使用

UTF-16 使用二或四个字节为每个字符编码其中大部分汉字采用两个字节编码少量不常用汉字采用四个字节编码UTF-16 编码有大尾序和小尾序之别 UTF-16BE UTF-16LE在编码前会放置一个 U+FEFF U+FFFEUTF-16BE FEFF 代表UTF-16LE FFFE 代表),其中 U+FEFF 字符在 Unicode 中代表的意义是 ZERO WIDTH NO-BREAK SPACE顾名思义它是个没有宽度也没有断字的空白

UTF-32 使用四个字节为每个字符编码使得 UTF-32 占用空间通常会是其它编码的二到四倍UTF-32 UTF-16 一样有大尾序和小尾序之别编码前会放置 U+0000FEFF U+0000FFFE 以区分
17 changes: 17 additions & 0 deletions basics/java-basic/big-endian-vs-little-endian.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
字节序也就是字节的顺序指的是多字节的数据在内存中的存放顺序

在几乎所有的机器上多字节对象都被存储为连续的字节序列例如如果C/C++中的一个int型变量 a 的起始地址是&a = 0x100那么 a 的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置

根据整数 a 在连续的 4 byte 内存中的存储顺序字节序被分为大端序Big Endian 小端序Little Endian两类

Big Endian 是指低地址端 存放 高位字节
Little Endian 是指低地址端 存放 低位字节

比如数字0x12345678在两种不同字节序CPU中的存储顺序

Big Endian12345678
Little Endian78563412

Java采用Big Endian来存储数据C\C++采用Little Endian在网络传输一般采用的网络字节序是BIG-ENDIAN和Java是一致的

所以在用C/C++写通信程序时在发送数据前务必把整型和短整型的数据进行从主机字节序到网络字节序的转换而接收数据后对于整型和短整型数据则必须实现从网络字节序到主机字节序的转换如果通信的一方是JAVA程序一方是C/C++程序时则需要在C/C++一侧使用以上几个方法进行字节序的转换而JAVA一侧则不需要做任何处理因为JAVA字节序与网络字节序都是BIG-ENDIAN只要C/C++一侧能正确进行转换即可发送前从主机序到网络序接收时反变换)。如果通信的双方都是JAVA则根本不用考虑字节序的问题了
15 changes: 15 additions & 0 deletions basics/java-basic/gbk-gb2312-gb18030.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
三者都是支持中文字符的编码方式最常用的是GBK

以下内容来自CSDN介绍的比较详细

GB23121980):16位字符集收录有6763个简体汉字682个符号共7445个字符
优点适用于简体中文环境属于中国国家标准通行于大陆新加坡等地也使用此编码
缺点不兼容繁体中文其汉字集合过少

GBK1995):16位字符集收录有21003个汉字883个符号共21886个字符
优点适用于简繁中文共存的环境为简体Windows所使用代码页cp936),向下完全兼容gb2312向上支持 ISO-10646 国际标准所有字符都可以一对一映射到unicode2.0
缺点不属于官方标准和big5之间需要转换很多搜索引擎都不能很好地支持GBK汉字

GB180302000):32位字符集收录了27484个汉字同时收录了藏文蒙文维吾尔文等主要的少数民族文字
优点可以收录所有你能想到的文字和符号属于中国最新的国家标准
缺点目前支持它的软件较少
9 changes: 9 additions & 0 deletions basics/java-basic/time-zone.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
时区是地球上的区域使用同一个时间定义以前人们通过观察太阳的位置时角决定时间这就使得不同经度的地方的时间有所不同地方时)。1863首次使用时区的概念时区通过设立一个区域的标准时间部分地解决了这个问题

世界各个国家位于地球不同位置上因此不同国家特别是东西跨度大的国家日出日落时间必定有所偏差这些偏差就是所谓的时差


为了照顾到各地区的使用方便又使其他地方的人容易将本地的时间换算到别的地方时间上去有关国际会议决定将地球表面按经线从东到西划成一个个区域并且规定相邻区域的时间相差1小时在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时当人们跨过一个区域就将自己的时钟校正1小时向西减1小时向东加1小时),跨过几个区域就加或减几小时这样使用起来就很方便现今全球共分为24个时区由于实用上常常1个国家或1个省份同时跨着2个或更多时区为了照顾到行政上的方便常将1个国家或1个省份划在一起所以时区并不严格按南北直线来划分而是按自然条件来划分例如中国幅员宽广差不多跨5个时区但为了使用方便简单实际上在只用东八时区的标准时即北京时间为准

北京时间比洛杉矶时间早15或者16个小时具体和时令有关
北京时间比纽约时间早12或者13个小时具体和时令有关
3 changes: 3 additions & 0 deletions basics/java-basic/timestamp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
时间戳timestamp),一个能表示一份数据在某个特定时间之前已经存在的完整的可验证的数据,通常是一个字符序列唯一地标识某一刻的时间

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数通俗的讲时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据
9 changes: 9 additions & 0 deletions basics/java-basic/url-encode.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
网络标准RFC 1738做了硬性规定 :只有字母和数字[0-9a-zA-Z]、一些特殊符号$-_.+!*'(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL;

除此以外的字符是无法在URL中展示的所以遇到这种字符如中文就需要进行编码

所以把带有特殊字符的URL转成可以显示的URL过程称之为URL编码

反之就是解码

URL编码可以使用不同的方式如escapeURLEncodeencodeURIComponent
Empty file added basics/java-basic/why-gbk.md
Empty file.
17 changes: 17 additions & 0 deletions basics/java-basic/why-utf8.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
广义的 Unicode 是一个标准定义了一个字符集以及一系列的编码规则 Unicode 字符集和 UTF-8UTF-16UTF-32 等等编码规则

Unicode 是字符集UTF-8 是编码规则

unicode虽然统一了全世界字符的二进制编码但没有规定如何存储

如果Unicode统一规定每个符号就要用三个或四个字节表示因为字符太多只能用这么多字节才能表示完全

一旦这么规定那么每个英文字母前都必然有二到三个字节是0因为所有英文字母在ASCII中都有都可以用一个字节表示剩余字节位置就要补充0

如果这样文本文件的大小会因此大出二三倍这对于存储来说是极大的浪费这样导致一个后果出现了Unicode的多种存储方式

UTF-8就是Unicode的一个使用方式通过他的英文名Unicode Tranformation Format就可以知道

UTF-8使用可变长度字节来储存 Unicode字符例如ASCII字母继续使用1字节储存重音文字希腊字母或西里尔字母等使用2字节来储存而常用的汉字就要使用3字节辅助平面字符则使用4字节

一般情况下同一个地区只会出现一种文字类型比如中文地区一般很少出现韩文日文等所以使用这种编码方式可以大大节省空间比如纯英文网站就要比纯中文网站占用的存储下一些

0 comments on commit f0919b0

Please sign in to comment.