当前位置: 首页 > news >正文

深入理解“字符编码模型”

深入理解“字符编码模型”

作者:哲思

时间:2022.8.28

邮箱:zhe__si@163.com

GitHub:zhe-si (哲思) (github.com)

前言

最近踩坑了后端的文档生成,本想写篇相关的实践总结,忽然感悟到电子文档的魅力,尤其以“字符编码模型”为最,特此进行研究并写下此文。

不了解Unicode、UTF-8、UTF-16、GBK,搞不清楚码位、码元等概念,或者经常遇到乱码问题的小伙伴都可以在本文找到答案。

简述字符编码

编码错误示例

相信大家一定对上面的场景不陌生(„ಡωಡ„),这是一个经典的字符编码错误导致的乱码问题。而解决的方法也很简单,在打开文件的时候指定正确的编码方式即可。如图中的文本文件 a.txt 采用 utf-8 编码,指定该编码方式打开并读取文本内容如下图。

字符编码问题1解决方法

解决方案很简单,但方案背后所蕴含的知识可不简单,这就是“字符编码”。众所周知,一个字符类型(char)长度为 1 字节,由多个 char 组成的数组(约定以 \0 结尾)就是字符串。问题来了,一个字节只能表示 \(2^8\) (256)个数字,如何表示百倍于它的汉字呢?上面用到的 utf-8 又是什么?为什么不指定它就会乱码呢?

想要表示汉字很简单,一个字节不够,那再来个字节呀。用多个字节表示字符,又涉及具体用几个字节、如何高效利用空间、要表示范围足够大同时灵活可拓展等问题,因此提出了以 utf-8 为代表的字符编码的方法来告诉计算机如何解析字节流并将其转化为字符流。由于大部分字符编码的方法不互相兼容,用与编码时不同的编码方案解析它自然就会出错或者解析成错误的内容。

下面给出维基百科中的定义:字符编码(英语:Character encoding)是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。

概念可能不够具体,狭义来说,字符编码就是将字符(包括英文字母、汉字等)编码为计算机可以存储与解析的字节流形式,同时也支持从字节流解析回字符的形式。这是对现实生活中用到的文字与符号的建模,将它们用一种计算机可以理解的方式表示,来方便计算机处理。

为了标准化字符编码的过程,人们对编码设计的过程进行划分,提出了字符编码的抽象架构模型,共有 5 层,分别解决了字符编码流程中的五个具体细节问题,接下来进行详细介绍。

字符编码模型

设计字符编码,根据先后顺序可以分为以下五个步骤:

  1. 定义字符集:解决包含的字符范围的问题,声明都有哪些字符
  2. 编码字符集:解决如何用数字信号唯一的表示字符集中的每个字符
  3. 设计计算机保存字符编码用哪种数据类型以哪种规则保存:解决如何用某种数据类型描述字符编码后的数字信号
  4. 确定保存字符编码所用的数据类型如何映射到字节序列:解决数据类型(用来描述字符编码的数字信号)在计算机中(用字节序列)的表示方法
  5. 选择传输时合适的字节序列编码与压缩方案:解决描述字符串的字节序列在传输过程中的编码与压缩问题

基于上述五个步骤,定义:

\[字符编码模型 = 抽象字符表+编码字符集(CCS)+字符编码表(CEF)+字符编码方案(CES)+传输编码语法 \]

五层模型

1. 抽象字符表(Abstract character repertoire)

抽象字符表定义了当前的字符编码所支持的所有抽象字符的集合。

抽象字符是指人从视觉上认为不同而从含义逻辑上认为相同的一组实际字符的集合,可认为该集合中的字符表示的含义相同。一层含义是,一个汉字有楷、行、草、隶等多种形体,但都表示同一个汉字,如下图。另一层含义是,在 Unicode 中西班牙语的 ñ 由 n 和 ~ 两个字符组成,虽然看上去是一个,但是两种不同的含义。

山的各种写法

抽象字符表有些标准是封闭性的,抽象字符集合不会改变(包括: ASCII、ISO 8859 系列等);有些标准是开放性的,可以不断将新的字符添加到标准中(比如:Unicode)。

2. 编码字符集(CCS: Coded Character Set)

编码字符集在第一层抽象字符集的基础上,为每一个字符分配一个唯一的数字编码,让抽象的字符通过数字的方式表示出来。

编码字符集是一个映射过程,将抽象字符集中的每一个字符一对一的映射到一个坐标(若是一维就是单个整数)上,而每一个映射到的坐标(也就是数字编码)称为码位(也称码点),每个字符所占的码位称为码位值。所以,也可以称:编码字符集就是把抽象字符集中的每个抽象字符映射为码位值

用来表示码位的坐标空间的维度称之为编码空间,可用一组数字、存储单元尺寸或者一些特殊形式表示。例如:GB 2312 汉字编码空间可表示为 94 × 94;ISO-8859-1的编码空间可表示为 8 比特或 256;Unicode 采用行、列、面的三维描述表示码位值。

这里特别讲解一下 Unicode(统一码)的编码字符集。每个 Unicode 字符编码可以表示为:U + 6个十六进制数字,比如:'0' 表示为 '\U000030'。Unicode 采用平面 + 16-bit 编码方式,每个平面的编码空间为 2^16(用'\U000030'的后四位表示,使用两个字节),共 17 个平面(用'\U000030'的前两位表示,使用一个字节),理论上能表示的字符数 = 平面数(17) × 平面编码空间大小(2^16) = 1114112。17个平面编号为0-16(0x00-0x10),如下图。

unicode平面

日常中常用的字符都定义在 0 号平面,该平面的码点表示时可以省略前两个十六进制位的平面号。平面中不是每个位置都定义了对应的字符,还有不少空间保留或作特殊用途。

每个抽象字符在 Unicode 中采用唯一且不可变的字符名称来表示,如:拉丁字母 K 在 Unicode 中的字符名称是“Latin Capital Letter K”,码点是 004B。

3. 字符编码表(CEF: Character Encoding Form)

字符编码表将数字表示的码位值转换为整型值序列(由多个固定有限长度的整形数据类型组成)表示。

用来表示码位的有限长度整形,是计算机表达字符编码(码位值)的单位,称为编码单元,简称码元

定义字符编码表有两步:

  1. 定义码元
  2. 定义如何使用多个码元表示码点值的规则

定义码元通常采用 8 bit(字节)的倍数。码元的存在,规整了表示不同字符的存储方式,避免在一串字符中用各种长度的整形混合表示。在计算机中采用字节的倍数存储与处理也匹配其存储、传输和处理的单位,对应计算机中的数据类型。

定义用码元表示码位值的规则,分为定长编码和变长编码。定长编码就是自身到自身的映射,如 ASCII 的编码 0-127,对应 7 bit,直接用 1 字节表示。UTF-32是 Unicode 对应的定长编码方案,字节内容一一对应码点。

变长编码基于某种规则将码位值根据需要映射到不同个数的码元序列上。

UTF-8

此处以 Unicode 最通用的字符编码表 UTF-8 进行说明。UTF-8 是 Unicode 的一种边长编码,码元为 8 bit,采用 1 - 4 个码元(字节)表示一个字符,根据字符码位值的不同变换表示长度。编码规则如下:

Unicode 十六进制码点范围 UTF-8 二进制
0000 0000 - 0000 007F 0xxxxxxx
0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  1. 对于单个字节的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode 码点。因此,对于英文中的 0 - 127 号字符,与 ASCII 码完全相同。这意味着 UTF-8 完全兼容过去用 ASCII 编码的文档。
  2. 对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为 0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充。
UTF-16

UTF-16 则采用 16bit(两个字节) 码元,编码规则为:基本平面的字符占用 2 个字节,辅助平面的字符占用 4 个字节。而确定是用一个码元还是两个码元是通过基本平面中 U+D800 - U+DFFF 的编码留白实现的。

辅助平面的字符位共有 2^20 个,因此表示这些字符至少需要 20 个二进制位。UTF-16 将这 20 个二进制位分成两半,前 10 位映射在 U+D800 到 U+DBFF(空间大小 2^10),称为高位(H),后 10 位映射在 U+DC00 到 U+DFFF(空间大小 2^10),称为低位(L)。这意味着,一个辅助平面的字符,被拆成两个基本平面的字符表示。

第二层的编码字符集和该层字符编码表是多对多关系,一种编码方式也可应用多种字符集,如:EUC 编码方式可以用于 GB 2312,也可以用于 JIS X 0208(一种日语字符集编码标准);一种字符集何以对应多种编码方式,如:Unicode 对应UTF-8、UTF-16、UTF-32等编码方法,如下图所示。

utf编码示例

例如,“汉字”这两个中文字符的 Unicode 码位值是 0x6C49 和 0x5B57,可用码元对应整数类型的数组表示为

utf编码示例2

4. 字符编码方案(CES: Character Encoding Scheme)

字符编码方案将码元映射到字节序列。

抽象字符的码位值可以通过具体数据类型的码元表示了,但由于这些数据类型可能需要多个字节才能表示,我们还没有解决码元如何用字节序列表示。码元映射为字节序列,也就是将特定的整数类型映射到对应的字节序列。一般讲的就是字节序,也就是大端小端(当然,还有一些更复杂的)。

大端:低位地址存放高位数据,高位地址存放低位数据。与人的一般书写习惯一致,网络字节序要求使用大端。

小端:低位地址存放低位数据,高位地址存放高位数据。

如:数字 0x0102,大端存储为 [0x01, 0x02],小端存储为 [0x02, 0x01]。

在编程中,我们大多时候无需关系字节序,而是直接使用具体的数据类型,字节序作为操作系统或硬件的内部实现对用户透明。但是文本不仅需要在本地内存中读写,还要再磁盘中存储并在多个异构系统中传阅,这就需要保证字节序一致或者读取到文本所使用的字节序。因此,为了表示码元的字节序列在读写时的一致性,需要定义字符编码方案。

解决字节序问题,一般有两种方案:

  1. 强制规定使用某种字节序。如网络传输强制要求网络字节序使用大端序。
  2. 使用字节序标记说明当前使用的字节序。字符集编码一般采用这种方案。Unicode 编码方案中有个叫 BOM(Byte Order Mark)的东西,就是用来做这事的。

当然,对于码元为单字节的情况下,不存在字节序问题,如 UTF-8,这也是 UTF-8 广泛使用的原因之一。但一些 UTF-8 文件也存在 BOM 头,但这不是必须的,只是用来标识该文件采用 UTF-8 编码。

5. 传输编码语法(transfer encoding syntax)

传输编码语法用于处理第四层字符编码方案提供的字节序列,主要包括变换传输形式和压缩字节序列。

变换传输形式指将字节序列的值映射到一套更受限制的值域内,来满足传输环境限制。如:Email传输采用Base64或者quoted-printable,都是把8位的字节编码为7位长的数据。

压缩字节序列就是指一些无损字节序列压缩技术。如:LZW或者行程长度编码。

模型综述

从整体上看,字符编码模型是对人类理解的抽象字符到计算机实际表示、存储和传输字符的数据形式的建模过程。

第一层抽象字符表是对人类理解的抽象字符的总结,明确了抽象字符范围。每个抽象字符可能字形不同(写法不同),在不同语境下字符表示的含义不同,但从字符本身的角度逻辑相同,并采用字符名称等方式唯一的标识该字符。

第二层编码字符集则为抽象字符编号,将抽象字符表示成数学形式,类似模电和数电的关系,因为只有数字才能进一步保存到计算机。但注意,这一层并不涉及计算机,数学编号也是人类意义上的编号,但将形式上的符号抽象为数学编号表示,是用计算机建模现实事务的关键一步。

第三层字符编码形式是真正用计算机表示字符的第一步,这里采用计算机的抽象数据类型(码元)来表示人类对字符的抽象描述(数学编码)。

第四层字符编码方案则进一步将用计算机的抽象数据类型表示的字符映射到计算机真正的底层表示——字节流上。到这一层,字符已经完全转化为计算机的表示方式,计算机可以基于上述模型栈(其顺序处理的形式可以理解为栈)对字符进行读写或其他操作,并在计算机底层表示和人类的抽象字符间相互转化。

第五层传输编码语法是对计算机底层数据流额外的附加处理,来提升传输效率或满足传输要求。

上述字符编码模型可以进一步总结为一种计算机建模的通用思想:明确现实事物、建模事物、用计算机数据类型表示、用计算机底层字节序列表示、对字节序列的优化处理

字符与字形

在前面的学习中,我们已经知道了通过字符编码模型将抽象字符转换为计算机底层数据结构的过程,好像已经圆满了。但请你重新审视你正在读的文字中的字符,并回忆刚刚所学,字符编码模型是否是完整的一条从你所见的字符到计算机底层表示的链路?

没错,缺少了字形。在抽象字符集中我们强调,字符集中的字符是逻辑上的抽象字符,而不是我们直接看到的字符,每个字符在不同的书写方式下都有多种字形表示。那么,现在是如何表示字形的呢?

字形描述,就是字体。字体描述了字符的形状,告诉了计算机如何“画出”某个字符,描述方式一般有散点和矢量。

由于本文重点在字符编码模型,所以在此不进行更详细的介绍。

举个实践例子

s := "hi你好 "
fmt.Println("runes: ")
for _, r := range s {fmt.Printf("%v ", r)
}fmt.Println("\nbytes: ")
for i := 0; i < len(s); i++ {fmt.Printf("%v ", s[i])
}
fmt.Println("\n\nlen(s): ", len(s))

提问,上述 go 代码的输出结果是什么?

runes:
104 105 20320 22909 32             
bytes:                             
104 105 228 189 160 229 165 189 32 len(s):  9 

你猜对了吗?😏

这就是一个字符的码位(rune)和字节序列的对比使用场景。for-range 遍历的是字符串中每一个字符的码位值。而字符串实际采用 byte 数组存储,通过 len 函数获取长度已经根据下标的索引都是读取字符底层的字节序列表示。也就是说,go 中字符串本质上就是个 byte 数组,正好存储字符的底层字节表示,但提供了一个解析 byte 数组为字符的视图,让我们可以遍历读取字符串中的字符。

image-20220828022349585

python 中,也可以通过编码和解码,在字符串和 bytes(字节数组)间转换。

后记

字符编码是电子文档的基础,也是编程的基础。只有了解了字符编码,才能对最常用的数据类型之一——字符串使用的游刃有余。

之后会继续研究电子文档,并写两篇 pdf、word、xlsx 等场景文档的生成、修改和底层格式设计的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-140949.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

如何html css完成分层金字塔

近期才通过自学了html和css&#xff0c;今日恰好做一个金字塔实例&#xff0c;能够清晰的看得出标志数据信息&#xff0c;必须 的朋友们下边伴随着小编来一起学习学习吧 文中关键详细介绍了html css完成分层次金字塔的实例&#xff0c;共享给大伙儿&#xff0c;实际以下&#…...

第三方依赖库中kotlin代码提示/*compiled code*/

在AS某些版本中&#xff0c;例如Android Studio Arctic Fox | 2020.3.1&#xff08;新版狐狸那个版本&#xff09;&#xff0c;在看第三方依赖库代码时&#xff0c;出现了这种问题&#xff0c;java部分的代码可以看到完整的方法实现&#xff0c;而kotlin部分的代码在方法实现中…...

ctfshow--web入门爆破

21.爆破什么的&#xff0c;都是基操 下载密码破解字典&#xff0c;打开链接&#xff0c;是一个用户名密码输入&#xff0c;用burp进行爆破 随便输入一个用户名和密码&#xff0c;然后在burp中用自定义迭代器进行爆破 最后直接进行攻击&#xff0c;然后爆破出现flag 22.进…...

AndroidStudio自动下载 jxbrowser 卡住解决办法

最近更新了 Android Studio到 Arctic Fox 版本后&#xff0c;打开项目会自动下载 jxbrowser &#xff0c;但是这个插件是 Google 的&#xff0c;正常是不能下载成功的&#xff0c;虽然不影响开发&#xff0c;但一直出现下载状态挺难受 解决方法很简单 就是设置代理 找到设置 …...

使用选项卡CSS样式,出现include图表html显示过小(不正常). CSS样式:

问题:使用选项卡CSS样式,出现include图表html显示过小(不正常). CSS样式: <style>#menu2{display: none;}#menu2:target{display: block;} </style>原因: 在设置生成图表时没有指定图表的固定大小. <div id"{{ c.chart_id }}" class"chart-cont…...

数据结构 study 5: typedef 结构体 数组 作为形参

代码 /* c1.h (程序名) */ #include<string.h> #include<ctype.h> #include<malloc.h> /* malloc()等 */ #include<limits.h> /* INT_MAX等 */ #include<stdio.h> /* EOF(^Z或F6),NULL */ #include<stdlib.h> /* atoi() */ #include <…...

Linux之VFS

一、概述 1.1 VFS简介 Linux支持多种不同文件系统&#xff0c;要实现这个目的&#xff0c;就要将对各种不同文件系统和管理纳 入到一个统一的框架中&#xff0c;让内核中的文件系统界面成为一条文件系统“总线”&#xff0c;使用户程序 可以通过同一个文件系统操作界面&#x…...

世界银行报告:融合技术革命和人力资本

南亚的人力资本挑战是世界上最严重的挑战之一。其中包括儿童严重营养不良、早期学习严重不足、持续的传染病负担、妇女权利的丧失以及普遍存在的结构性不平等。 到2020年8月底&#xff0c;在大流行第一波开始的几个月内&#xff0c;该地区报告了440万例感染和75000例死亡。强调…...

隐私保护与生成模型: 差分隐私GAN的梯度脱敏方法

一、差分隐私是什么&#xff1f; 这篇文章以差分隐私和生成模型为主要研究对象&#xff0c;针对面临的问题&#xff0c;先介绍相关的背景知识和现有研究方法&#xff0c;后展示解决方案和实验结果。 机器学习模型的训练需要大量的数据喂食&#xff0c;而这些数据的应用就会涉…...

.Net Core中使用ElasticSearch(二)

.Net的ElasticSearch 有两个版本,Elasticsearch.Net(低级) 和 NEST(高级),推荐使用 NEST,低级版本的更灵活,水太深 把握不住。有个需要注意,使用的版本号必须要ElasticSearch服务端版本号一致。 一、 连接池1.1 SingleNodeConnectionPool 单节点连接池适合只有一个节点的情…...

web前端开发学习路线图!

移动互联网时代&#xff0c;HTML5前端开发成为“抢手货”&#xff01;各大招聘网站前端相关岗位空缺大、薪资高&#xff0c;很多人在学习前端开发&#xff0c;学习前端&#xff0c;我觉得最不缺少的一个是完善的系统的web前端开发/html5学习路线图&#xff0c;另一个就是好的课…...

树和二叉树——数据结构 (严蔚敏C语言版)

1.树 1.1树的定义 树(Tree)是n(n≥0&#xff09;个结点的有限集&#xff0c;它或为空树(n0);或为非空树&#xff0c;对于非空树T: (1&#xff09;有且仅有一个称之为根的结点;(2&#xff09;除根结点以外的其余结点可分为m (m>0)个互不相交的有限集T1, T2,…,Tm&#xff…...

解决国内下载vscode慢的方法

VSCO的的下载地址&#xff1a; https://code.visualstudio.com/Download 下载也太慢了 解决办法&#xff1a; 复制链接到新的窗口&#xff0c;将圈起来的地方改为国内镜像地址&#xff1a;vscode.cdn.azure.cn 然后几秒就下载好啦...

P4173 残缺的字符串

P4173 残缺的字符串 题意&#xff1a; 有A&#xff0c;B两个串&#xff0c;每个串都有通配符&#xff0c;问A为模板串&#xff0c;对于 B 的每一个位置 i&#xff0c;从这个位置开始连续 m 个字符形成的子串是否可能与 A 串完全匹配&#xff1f; 题解&#xff1a; 我们定义…...

20 设计模式

单例模式_1活着1的专栏-CSDN博客...

Linux 文件系统 整理

独栋别墅&#xff0c;容积率低 root 用户 高层。 用户组 用户 $more 预览 文件名 more /etc/group a.txt 文本 .java Java文件 Linux中不以后缀作为区分&#xff0c; 回车 &#xff1a;换行 空格&#xff1a;换页 q&#xff1a;退出 $tail&#xff1a; 尾巴 $tail -10 /etc/gr…...

cartographer_ros node (三)

上一次我们详细讲述了node_main中对应的开始轨迹的函数StartTrajectoryWithDefaultTopics&#xff0c;这次我们主要讲解在结束SLAM之后调用的node类中的两个函数FinishAllTrajectories和RunFinalOptimization() 首先是FinishAllTrajectories&#xff0c;这个函数用于结束所有处…...

VMware 仅主机模式虚拟机无法 ping 通物理机的问题

前言 最近做了另外一个项目&#xff0c;用的数据库软件版本比较新&#xff0c;我本机装的旧的&#xff0c;因版本原因无法还原数据库&#xff0c;考虑到以最快速度部署开发环境&#xff0c;决定在虚拟机里安装新版数据库软件&#xff0c;使用 VMware 网络类型的仅主机模式&…...

day01_java常识丶环境搭建丶入门程序

Java语言发展历史 Java诞生于SUN&#xff08;Stanford University Network&#xff09;&#xff0c;09年SUN被Oracle&#xff08;甲骨文&#xff09;收购。Java之父是詹姆斯.高斯林(James Gosling)。1996年发布JDK1.0版。 目前最使用最多的版本是Java8。 ​ Java技术体系平台 …...

Python numpy.unpackbits函数方法的使用

NumPy&#xff08;Numerical Python的缩写&#xff09;是一个开源的Python科学计算库。使用NumPy&#xff0c;就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数&#xff0c;涵盖线性代数运算、傅里叶变换和随机数生成等功能。本文主要介绍一下NumPy中unpackbits方法…...

数据科学手把手:碳中和下的二氧化碳排放分析 ⛵

气候是全球性的话题,本文基于owid co2数据集,分析了世界各地的二氧化碳排放量,并将二氧化碳排放的主要国家以及二氧化碳排放来源进行了可视化。💡 作者:韩信子@ShowMeAI 📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40 📘 本文地址:https://www.show…...

【Prometheus+Grafana系列】监控MySQL服务

前言 前面的一篇文章已经介绍了 docker-compose 搭建 Prometheus + Grafana 服务。当时实现了监控服务器指标数据,是通过 node_exporter。Prometheus 还可用来监控很多服务,比如常见的 MySQL。本文就介绍如何通过 mysqld_exporter 来监控 MySQL 指标。 下载安装包 cd /opt w…...

彻底理解线程

操作系统支持多个应用程序同时执行,每个应用至少对应一个进程,彼此之间的操作和数据不受干扰。当一个进程需要磁盘IO的时候,CPU就切换到另外的进程,提高了CPU利用率。有了进程,为什么还要线程?因为进程的成本太高了。启动新的进程必须分配独立的内存空间,建立数据表维护…...

【C++】实现D3D9 的 Inline hook

【C++】实现D3D9 的 Inline hook简单介绍一下HOOK原理:函数调用的过程大致是 先push 参数 进去,再执行 call 函数地址 ,进入函数。此时将所调用的函数的前五个字节修改,将开头改成 jmp xxxxxxxx(地址偏移) ,则可以进入自己的函数,执行自己函数的内容,执行完自己的函数后…...

C++ Protobuf

Protobuf protobuf (protocol buffer) 是谷歌内部的混合语言数据标准。通过将结构化的数据进行序列化(串行化),用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。序列化: 将结构数据或者对象转换成能够用于存储和传输的格式。反序列化: 在其…...

identity4 系列————纯js客户端案例篇[四]

前言 前面已经解释了两个案例了,通信原理其实已经很清楚了,那么纯js客户端是怎么处理的呢? 正文 直接贴例子哈。 https://github.com/IdentityServer/IdentityServer4/tree/main/samples/Quickstarts/4_JavaScriptClient那么解释一下其实怎么做的吧。 那么就直接来看这个jav…...

实现艾尔登法环中的大卢恩效果

使用顶点动画中的广告牌技术(Billboarding),实现简单的艾尔登法环中的大卢恩效果使用顶点动画中的广告牌技术(Billboarding),来实现大卢恩在竖直方向上保持始终朝向玩家的效果。 1、广告牌技术原理 广告牌技术会根据视角方向来旋转一个被纹理着色的多边形,通常用于渲染烟…...

图床搭建|chrome插件|操作简单不要钱

为什么需要一个图床 为了写博客 图床:专门用来存放图片,同时允许你把图片对外连接的网上空间. 用markdown格式写作,插入图片需要图片的url地址,然后博客的背景图也是要用url地址。 有段时间,我一直很想拥有一个自己的博客。这个博客既要足够简洁明了,又要有一定的观赏性。我…...

【面试题】如何去掉vue的url地址中的#号?及其原理?

如何去掉vue的url地址中的#号?及其原理? 点击打开视频讲解更加详细 如何去掉vue的url地址中的#号? import Vue from vue;import VueRouter from vue-router;Vue.use(VueRouter)// 1. 定义一些路由 // 每个路由都需要映射到一个组件。 const routes = [{ path: /home, compon…...

学习ASP.NET Core Blazor编程系列一——综述

一、NET 6概述.NET 6 是微软统一.Net Core与.Net Framework 两大框架的第二个版本,微软在 .NET 5 中开始进行这两大框架的统一之路。.NET 6 将作为长期支持 (LTS) 版本得到三年的支持。只有Visual Studio 2022(以及更高版本)支持 .NET 6。Visual Studio 2017/2019等版本都不…...

乌云停摆危机幕后:“正面黑客”究竟是什么人?

QQ、微信被盗&#xff0c;某个网站的帐户密码泄露&#xff0c;个人身份证、电话等信息被泄露……这背后几乎都离不开黑客。在IT世界里&#xff0c;黑客分为两种&#xff0c;一种是“黑客”&#xff0c;把系统漏洞兜售到黑市上&#xff0c;谋取巨额利益。另一种则是“正面黑客”…...

VR中的白帽机制,这把安全的双刃剑应该如何使用?

白帽与黑客相对&#xff0c;简单来说白帽就是未受聘用的网络安全管理员&#xff0c;有点类似于侠盗罗宾汉。而所谓的白帽机制&#xff0c;即利用白帽黑客来挖掘程序系统中漏洞的一种形式。 Facebook、微软&#xff0c;Google目前都有自己与VR相关的白帽机制&#xff0c;主要手法…...

滴滴WebApp实践经验分享

黄轶&#xff0c;前端技术专家&#xff0c;现就职于滴滴出行公共FE团队&#xff0c;前端技术专家&#xff0c;《Vue.js权威指南》主要作者。计算机专业硕士&#xff0c;2012年毕业于北京科技大学&#xff0c;曾任职百度。擅长前端自动化、工程化&#xff0c;前端架构等方向。业…...

那些被关闭的漏洞平台和那些被抓的白帽黑客:这不是第一次,恐怕也不是

今年6月下旬&#xff0c;第四届中国网络安全大会期间&#xff0c;一封来自某“白帽黑客”父亲的公开信在网络信息安全业内流传。这位“黑客父亲”称&#xff0c;其子袁炜是一名白帽黑客&#xff0c;去年12月初&#xff0c;白帽黑客袁炜通过乌云平台提交了一份关于世纪佳缘的漏洞…...

曾披露“开房信息”的乌云网 如今摊上大事儿了

在互联网世界&#xff0c;乌云网一直扮演着“守护者”角色&#xff0c;但乌云网模式自诞生起&#xff0c;就一直行走在灰色地带&#xff0c;因而备受争议。乌云网此次危机&#xff0c;正是这一灰色地带的风险爆发所致。方小顿显然没有意识到事态的严重性&#xff0c;前不久&…...

如何评价国内SRC纷纷上线“白帽子协议”?

2017年6月1日21:21分 某监狱里&#xff0c;对话如下&#xff1a; 犯人A:你们都是怎么来的&#xff1f; 犯人B:我是XX漏洞平台挖漏洞不小心进来的。 犯人C:我是XX平台路人甲&#xff0c;输错命令了rm -rf / &#xff08;批量删除&#xff09; 犯人D:我是某测评中心的忘了要授权了…...

滴滴:WebApp实践经验总结

本文为滴滴公共FE团队在WebApp方向的一些实践经验总结&#xff0c;主要内容包括&#xff1a;WebApp首页技术架构、前端工程化在WebApp的实践、通用地图JS库的设计和实践、 统一登录SDK的设计、通用客户端JSBridge的封装、在公共部门做通用服务的一些感悟、个人成长总结。 1. W…...

新书上市 | Vue 3.0 核心源码解析,这本书给Vue学习提供新方法

Vue.js 作为一款极简的 MVVM 框架&#xff0c;因其轻量、易上手&#xff0c;得到了众多开发者的喜爱。 自从 2014 年 Vue 诞生以来&#xff0c;这个框架设计的初衷&#xff0c;尤大说只是为了设计一个让自己用起来舒服的框架&#xff0c;随着受欢迎程度和用户数量的不断增加&am…...

百度技术沙龙第57期回顾:新时代的前端(含资料下载)

2014年12月21日&#xff0c;在由百度主办、InfoQ负责策划组织和实施的第57期百度技术沙龙活动上&#xff0c;百度移动云事业部资深研发工程师张袁炜分享了如何将原生能力融入到WebApp中&#xff0c;独立开发者郭宇分享了Node.js的应用场景和存在的问题。本文将对这两个分享做一…...

谈一谈我在阿里的成长

前几天受阿里通信的同事邀请&#xff0c;分享了一个关于成长的话题。其实我不太热衷于分享此类话题&#xff0c;作为一个技术人&#xff0c;分享那些没有技术干货的内容总感觉有些怪怪的。但最后还是拟下了这个话题 ——《谈一谈我在阿里的成长》&#xff0c;所以本文主要是对分…...

前端架构师亲述:前端工程师成长之路的 N 问 及 回答

问题回答者&#xff1a;黄轶&#xff0c;目前就职于 Zoom 公司担任前端架构师&#xff0c;曾就职于滴滴和百度。 1. 前端开发 问题 大佬&#xff0c;能分享下学习路径么&#xff0c;感觉天天忙着开发业务&#xff0c;但是能力好像没有太大提升&#xff0c;不知道该怎么充实自己…...

置身法律边缘的“白帽子”何以善其身

6月23日&#xff0c;在会议现场&#xff0c;拿着一封探讨“白帽子检测漏洞是不是犯罪”的信&#xff0c;袁冠阳讲述了儿子袁炜的遭遇——身为“白帽子”的袁炜&#xff0c;因检测世纪佳缘网存在的系统漏洞&#xff0c;而被警方以涉嫌非法获取计算机信息系统数据罪逮捕。这一案件…...

深入了解BLE(Bluetooth 5.3)持续更新...

目录 1 BLE的优点和局限性 1.1 BLE与经典蓝牙的区别 1.2 局限性 1.2.1 数据吞吐量 1.2.2 范围 1.3 BLE优势及应用 1.4 BLE的角色 1.5 BLE的层次结构 1.5.1 物理层&#xff08;PHY&#xff09; 1.5.2 链路层 1.5.2.1 数据包格式 1.5.2.2 状态机 1.5.2.3 设备地址 …...

贺岁杯围棋争霸赛打响 系列赛事启幕潘晓婷等将亮相

朴廷桓(左)芝野虎丸(中)柯洁(右)。组委会供图 中新网北京1月31日电 记者从赛事主办方获悉&#xff0c;1月31日下午2点&#xff0c;2019年第七届CCTV贺岁杯中日韩新春围棋争霸赛在成都武侯区天府芙蓉园打响&#xff0c;首局比赛由柯洁九段对阵朴廷桓(韩国)九段&#xff0c;赛事…...

AlphaGo技术剖析:揭开围棋大脑的神秘面纱

● 每周一言 智能所体现的思维与认知&#xff0c;没有标准。 导语 围棋&#xff0c;起源于我国尧舜时期&#xff0c;自古以来备受追捧&#xff0c;蕴含着中华文化的丰富内涵。有别于象棋和国际象棋&#xff0c;围棋棋盘之大&#xff0c;玩法千变万化&#xff0c;其落子的可能…...

强化学习 视频讲解_强化学习讲解

强化学习 视频讲解您可能已经听说过Google DeepMind的AlphaGo计划&#xff0c;该计划在2015年击败了2个单打的专业Go播放器时吸引了重大新闻。后来&#xff0c;改进的AlphaGo的发展继续击败了9个单盘&#xff08;最高排名&#xff09;的专业Go播放器在2016年&#xff0c;并在20…...

前台自动化测试:基于敏捷测试驱动开发(TDD)的自动化测试原理

一、自动化测试概述 自动化测试主要应用到查询结果的自动化比较&#xff0c;把借助自动化把相同的数据库数据的相同查询条件查询到的结果同理想的数据进行自动化比较或者同已经保障的数据进行不同版本的自动化比较&#xff0c;减轻人为的重复验证测试。多用户并发操作需要自动…...

np.append()

np.append(arr, values, axisNone) 作用&#xff1a; 为原始arr添加一些values 返回值&#xff1a; 返回添加了values的新数组 参数&#xff1a; arr:需要被添加values的数组values:添加到数组arr中的值&#xff08;array_like&#xff0c;类数组&#xff09;axis:可选参数&am…...

P问题、NP问题、NP-C问题、NP-H问题简介

P&#xff08;Polynomial&#xff09;问题&#xff1a;在多项式时间内可以解决的所有决策问题的集合。也就是说&#xff0c;对于一个问题可以在多项式时间内确定是“是”还是“否”。 NP&#xff08;Non-deterministic Polynomial&#xff09;问题&#xff1a;NP问题不是非P问…...

np.max()、np.argmax()、np.maximum()、np.min()、np.argmin()、np.minimum()、np.sum()

numpy专题——最值、求和最大值np.max()np.argmax()np.maximum()求和np.sum网上已经有很多对于这几个函数的讲解资料&#xff0c;但总感觉讲得有些乱&#xff0c;特别是对于高维数组&#xff0c;如果指定了某个轴&#xff0c;就会变得很复杂。这篇文章根据”拆分“原理&#xf…...