首页 > 其他 > 详细

前端工程师-字体图标-Unicode

时间:2020-07-01 16:30:34      阅读:55      评论:0      收藏:0      [点我收藏+]

前言

由于字体图标的问题,引发了我对编码探究的想法

1.字符集与字符编码(计算机)

这个概念一定要先明确:其实网上已经有一大堆的解释了,大家只要复制“字符集与字符编码”到百度会搜出一箩筐,我这里使用我自己的理解来解释,如果有不对的地方诚邀指正,不胜感激!

字符集:顾名思义就是一个字符的二进制代码的集合,这些字符是什么?就是我们在现实中看到的各种符号(包括文字,阿拉伯字符,()*%¥#%&..... ),他是一张大大的表,里面记录着每个字符与他对应的二进制代码;

字符编码:编码是个动词,就是把这些二进制翻译成计算机认识的二进制

解码:相对编码的就是解码了,解码就是把二进制翻译成我们可以理解的样子,比如Unicode字符集中,将U+0000 = space(键盘上的空格);

------------------------------------------------------------

奇怪,为什么有了字符集不是二进制代码集合吗,计算机不是存的就是二进制吗,为什么还要编码这个工具呢?

8bit(位) = 1byte(字节)

我们的计算机处理二进制的时候,如何得知把几位视为一个字符呢,是4位还是8位,还是3位?这个就需要硬件与软件系统做一个约定了,这个约定就是编码方式,这个编码方式就可以告诉计算机,我有一段二进制的编码,这段二进制编码,每3位算一个字符,计算机就知道,奥,我明白了

-----------------------------------------------------------

目前存在的字符集与字符编码有:ASCII字符集&编码,GBXXXX字符集&编码,BIG5字符集&编码,Unicode字符集&UTF编码

2.Unicode字符集

Unicode编码几乎囊括了目前我们所有的常用字符,数量已经达到了10万多,它为我们的常用字符都分配了一个编号(在Unicode中称为(码点))之前的定义说过,字符集是一堆字符与他的对应的码点(二进制码)的集合,那么Unicode是如何为这些字符分配编号(码点)的呢,是像我们平时的列表一样,从第一行开始,第N行结束,还是使用其他方式呢?

技术分享图片此处引用阮老师的图片

 

Unicode是双字节编码(1个byte = 8bit)它的基本字符是用 00000000 00000000 - 11111111 11111111 之间表示的,Unicode把这个范围称为‘基本平面’一共能包含2^16=65536个字符,基本包含了我们所有的常用字符。关于辅助平面可以看一下阮老师的文章

(为什么出现U+0000 - U+FFFF 呢,因为上面的一大坨0,1太长了,所以用16进制来表示了。)

2.UTF-8字符编码

(Unicode Transformation Format -8/16/32 bit ,utf-n,说明此编码方式就会以n约定为一个字符,此处我只说utf-8,其他的只是计算方式不同,由于我本人主要是为了了解到字符集与字符编码的大概,并不打算深究这个知识点,所以只记录最常用的)

之前的定义说过,字符编码是一个约定,告诉计算机,我有一段二进制的编码,这段二进制编码,每n位算一个字符,UTF-8做的就是这样一件事:

它约定如下:

1.如果字符需要用1个字节来表示,UTF-8就以0开头(1个字节的字符完美包含了ascii字符集中的字符,ascii字符集只有128个字符<2^8=256,所以Unicode的0-127的字符与ASCii码可以完全相同)

2.如果字符需要用n个字节来表示,UTF-8就约定以第一个字节前面n位为1,第n+1位为0,剩余的n - 1 个字节的前两位都设为 10。 

(U+与0x都表示后面是16进制)

Unicode编码(十六进制) 
UTF-8 字节流(二进制)
UTF-8 字节
U+0000 - U+007F(0x0000 - 0x007F)
0xxxxxxx
1
U+0080 - U+07FF(0x0080 - 0x07FF)
110xxxxx 10xxxxxx
2
U+0800 - U+FFFF(0x0800 - 0xFFFF)
1110xxxx 10xxxxxx 10xxxxxx
3
U+010000 - U+1FFFFF(0x010000 - 0x10FFFF)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx(21位用来表示字符)
4

3.html/css/js如何使用字符集与字符编码

使用Unicode字符集时,首先需要设置字符编码方式:

<!-- html中 -->
<!DOCTYPE html>
<html lang="en">
<head>

<!--HTTP HEADER-->
< meta  http-equiv = "Content-Type"  content = " text / html; charset = utf-8"  >

<!--  HTML4-style meta -->
< meta  http-equiv ="Content-Type"   content = "text / html;charset = "utf-8"  >

<!-- 短HTML5元(推荐)-->
< meta  charset = "utf-8" >
    <title>Title</title>
    <link rel="stylesheet" type="text/css" href="font_ztktsv718x/iconfont.css">
</head>

 

// css中,一般我们在html中指定了编码方式后,就不用在css中去指定了
@charset "UTF-8"

 

 JS 引擎可以选择使用 UCS-2 或者 UTF-16,为什么不用UTF-8历史原因,我把阮老师的文章截图放在这里,可以供大家了解:

技术分享图片

由于JavaScript只能处理UCS-2编码,造成所有字符在这门语言中都是2个字节,如果是4个字节的字符,会当作两个双字节的字符处理。JavaScript的字符函数都受到这一点的影响,无法返回正确结果。

技术分享图片

由于Ucs-2与Unicod合并了,但是基本平main的字符还是沿用了UCS-2,所以这里我们说JavaScript只能处理UCS-2编码。

// js中,用\u+16进制编码使用Unicode字符,js引擎是用\u进行转义的
ctx.fillText(‘\ue8ae‘, 10, 50);

 

html

&#x + 16进制编码  + ;

&# + 10进制编码  + ;

css

\ + 16进制编码

js

\u + 4位16进制编码

\x + 2位16进制编码

4.小结

最实用的应该就是上面这张表了。

5.感悟

写完以后我自己其实有点懵,我研究了这些是为了什么,是为了使用吗,但是后来我回顾我所写过的东西,包括我查的资料以及阅读过的文章,我发现了解知识的过程是为了走的更远,有点鸡汤,但是我通过自我问答的形式确实巩固了一些基础,并且学习到了一些知识,感觉到自己的渺小,任重道远,珍惜流逝的时光。

 

前端工程师-字体图标-Unicode

原文:https://www.cnblogs.com/nanshine/p/13215888.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!