Web常用的编码和解码技术

文章目录

    • 一、URI的编码与解码
      • 1.1 URI介绍
      • 1.2 什么是encodeURI
      • 1.3 什么是encodeURIComponent
      • 1.4 应用场景
      • 1.5 URI解码
      • 1.6 扩展:内置对象URL
    • 二、字符串的Base64编码与解码
      • 2.1 ASCII字符编解码
      • 2.2 非ASCII字符编解码

一、URI的编码与解码

1.1 URI介绍

URI指的是统一资源标识符(Uniform Resource Locator),它是用来标识和定位互联网上的资源(如网页、图片、文档等)的一种标识方式,它是一个广义的概念,如我们常用的URL就属于URIURL能够定位给到互联网上的某个资源的位置。它主要有两个子集:

  • URL:用于标识和定位互联网上的资源的位置。它包括了资源的地址和访问方式,以确保资源能正常被定位和检索。通常由以下6部分组成。

    • 协议protocol:指定了资源的访问方式,常见的协议包括HTTPHTTPSFTPmailtofile等。
    • 域名(也叫主机名)Host:指定了资源所在的服务器或计算机的域名或IP地址。
    • 端口Post:端口是可选的,它指定了服务器上用于处理请求的端口号。如果未指定端口,通常会使用默认端口,如 HTTP 的默认端口是 80。
    • 路径Path:指定了服务器上资源的位置,通常是一个文件路径或目录路径。路径以斜杠 / 开头,如 /images/pic.jpg
    • 查询参数Query:查询参数允许传递额外的信息给服务器,通常以 ? 开头,参数之间用 & 分隔,如 ?name=John&age=30
    • 片段标识符(在location对象中是hash)Fragment:用于指定资源中的特定位置,如文档内的锚点。

    示例URLhttps://www.example.com:8080/images/pic.jpg?name=John&age=30#section2

  • URN:用于标识资源的名称,而不关心资源的位置或如何访问它。URN 的目的是提供一个唯一的、永久的资源标识符。例如,ISBN(国际标准书号)就是一种 URN,它用于唯一标识图书,而不考虑图书的存储位置或如何获取它。

1.2 什么是encodeURI

encodeURI()是JavaScript的一个内置函数,用于将字符串中的特殊字符进行编码,以便能够在URL中传递

其中encodeURI不会编码的特殊字符包括:【主要就是url常见字符】

类型包含
非转义字符A-Z、a-z、0-9、_.-!~'()
保留字符:/?=&(前面这些属于url常见字符)、;,@+$
数字符号#(这个也属于url常见字符)

语法:encodeURI(URI)URI是一个字符串,返回一个新字符串。

1.3 什么是encodeURIComponent

encodeURIComponent()也是JavaScript的一个内置函数,同样用于将字符串中的特殊字符进行编码,以便能够在URL中传递。与encodeURI()相比它会编码更多的字符。

它不会编码的特殊字符只有:

类型包含
非转义字符A-Z、a-z、0-9、_.-!~'()

也就是说encodeURIComponent()会对url常见字符进行编码。

语法:encodeURIComponent(uriComponent):uriComponent是一个string、number、boolean、null,undefined 或者任何 object。在编码之前,uriComponent 参数会被转化为字符串。返回新字符串。

下面我们通过代码对比encodeURI

let url = "https://www.aaa.com/path?name=zhangsan&age=18#fragment1";
// 输出:https://www.aaa.com/path?name=zhangsan&age=18#fragment1
console.log(encodeURI(url));
// 输出:https%3A%2F%2Fwww.aaa.com%2Fpath%3Fname%3Dzhangsan%26age%3D18%23fragment1
console.log(encodeURIComponent(url));

可以明显看到encodeURIComponenturl常见字符进行了编码。

1.4 应用场景

1 输入内容编码

假设我们有一个搜索功能,用户可以输入关键字进行搜索。用户输入的关键字可能包含特殊字符,如空格、问号、和号等。为了将关键字作为 URL 参数传递给服务器,我们需要使用 encodeURIComponent 对其进行编码。

const userInput = "JavaScript 2a+ 学习?";// 编码用户输入
const encodedKeyword = encodeURIComponent(userInput);// 构建 URL
const searchURL = `https://example.com/search?keyword=${encodedKeyword}`;console.log(searchURL);  // https://example.com/search?keyword=JavaScript%202a%2B%20%E5%AD%A6%E4%B9%A0%3F

2 Ajax请求

在使用 JavaScript 进行 AJAX 请求时,encodeURIComponent 也非常有用。当使用 fetchXMLHttpRequest 发送数据时,特别是发送 POST 请求时,需要确保请求体中的数据是经过编码的

let data = {username: "John Doe",email: "john.doe@example.com",
};// 将 JavaScript 对象转换为 URL 编码的字符串
const encodedData = Object.keys(data).map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`).join("&");console.log(encodedData);  // username=John%20Doe&email=john.doe%40example.comfetch("https://example.com/submit", {method: "POST",headers: {"Content-Type": "application/x-www-form-urlencoded",},body: encodedData,
});

1.5 URI解码

使用decodeURIdecodeURIComponent可以解码

// 未编码的str: username=John Doe&email=john.doe@example.com
// 输出:username=John Doe&email=john.doe%40example.com
console.log(decodeURI('username=John%20Doe&email=john.doe%40example.com'));
// 输出:username=John Doe&email=john.doe@example.com
console.log(decodeURIComponent('username=John%20Doe&email=john.doe%40example.com'));

可以看到由于encodeURI不能编码保留字符@,因此decodeURI也不能将@对应的编码%40转回@

1.6 扩展:内置对象URL

这里扩展一下内置对象URL。

我们可以使用 new URL() 构造函数创建 URL 对象并访问其属性方法,类似于location,URL 对象还提供了一些方法,例如searchParams 属性可以访问查询字符串参数等。

const url = new URL("https://www.aaa.com/path?name=zhangsan&age=18#fragment1");
console.log(url.protocol); // https:  协议
console.log(url.host); // www.aaa.com  域名
console.log(url.port); //   端口
console.log(url.pathname); // /path  路径
console.log(url.search); // ?name=zhangsan&age=18  query
console.log(url.hash); // #fragment1  hash
console.log(url.origin); // https://www.aaa.com  origin// 获取参数
console.log(url.searchParams.get("name"));  // zhangsan// 下面这种形式也能获取参数
const params = new URLSearchParams(url.search)
console.log(params.get('name'))  // zhangsan

二、字符串的Base64编码与解码

由于 Base64 编码后的字符串只包含 ASCII 字符,因此可以安全地传输或存储到不支持二进制数据的地方(如URL、XML等),以避免出现数据传输或存储时的格式问题。

toa()atob() 是 JavaScript 内置的用于 Base64 编码和解码的方法。

2.1 ASCII字符编解码

btoa() 方法用于将字符串转换为 Base64 编码。它接受一个字符串作为参数,返回一个 Base64 编码的字符串。例如:

ASCII字符编码为Base64

const str = 'Hello world'
const encodedStr = btoa(str)console.log(encodedStr) // SGVsbG8gd29ybGQ=

atob()方法用于将Base64的字符串转换为原始字符串,如下:

解码

const encodedStr = 'SGVsbG8gd29ybGQ='
const str = atob(encodedStr)
console.log(str) // Hello world

2.2 非ASCII字符编解码

需要注意的是,btoa() atob() 方法只能处理 ASCII 字符串(包含 128 个字符,其中包括英文字母、数字、标点符号和一些控制字符),如果字符串中包含非 ASCII 字符(如中文文字),需要先将其转换为UTF-8编码的字节数组,再进行 Base64 编码。例如:

非ASCII字符编码Base64

const str = "你好 世界";
// TextEncoder构造函数接受码位流作为输入,并提供 UTF-8 字节流作为输出
const utf8Bytes = new TextEncoder().encode(str);  // 转成utf8编码的字节数组
const encodedStr = btoa(String.fromCharCode(...utf8Bytes));  // 编码为base64编码的ASCII字符串
console.log(encodedStr); // 5L2g5aW9IOS4lueVjA==

解码

const decodedBytes = atob('5L2g5aW9IOS4lueVjA==').split('').map(char => char.charCodeAt(0))  // 转成utf8编码的字节数组
// TextDecoder接受一个ArrayBuffer、TypedArray或包含要解码的编码文本的对象,返回解码后的字符串。
const decodedStr = new TextDecoder().decode(new Uint8Array(decodedBytes))  //
console.log(decodedStr) // 你好 世界

应用场景:

在前端开发中,经常需要将图片或音频等二进制数据转换为 Base64 编码的字符串,以便在网页中直接显示或传输。

下面代码实现了将图片资源转成base64格式。

async function mediaToBase64(filePath) {// 将图片资源转成blob格式const blob = await fetch(filePath).then((res) => res.blob());// 创建一个Promise对象,将Base64编码后的图片数据存储在变量base64中const base64 = await new Promise((resolve) => {// 创建一个FileReader对象,用于将Blob对象中的数据转换为Base64编码的字符串const reader = new FileReader();// 当FileReader对象读取完成时触发onload事件reader.onload = () => {console.log(reader.result);  // data:image/png;base64,base64字符串....// 将DataURL中的Base64编码字符串取出,并将其存储在变量base64中resolve(reader.result.split(",")[1]);};// 将Blob对象中的数据读取为DataURLreader.readAsDataURL(blob);});return base64;  // 返回的是一个promise对象 所以接受结果的时候需要.then拿到res
}
mediaToBase64("./img.png").then((res) => {console.log(res);  // base64字符串....
});

要注意的是,由于 Base64 编码后的字符串通常比原始二进制数据大约33%,因此Base64格式只适合传输小量数据。

参考博客:

  1. 掌握 Web API 中常用的编码和解码技术:encodeURI、encodeURIComponent、new URL、btoa() 和 atob()
  2. 一个由于前端缺少 encodeURIComponent 引起的登录问题的分析和解决
  3. (JavaScript)escape、encodeURI、encodeURIComponent的介绍与区别

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【音视频 ffmpeg 学习】 RTMP推流 mp4文件

1.RTMP(实时消息传输协议)是Adobe 公司开发的一个基于TCP的应用层协议。 2.RTMP协议中基本的数据单元称为消息(Message)。 3.当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk&#xff…

Linux系统下隧道代理HTTP

在Linux系统下配置隧道代理HTTP是一个涉及网络技术的话题,主要目的是在客户端和服务器之间建立一个安全的通信通道。下面将详细解释如何进行配置。 一、了解基本概念 在开始之前,需要了解几个关键概念:代理服务器、隧道代理和HTTP协议。代理…

VsCode的介绍和入门详细讲解

VS Code(Visual Studio Code)是由 Microsoft 开发的一款轻量级开源编辑器,支持多种语言和框架的编写、调试和测试。它拥有丰富的扩展生态系统,可以满足不同开发者的需求。 下面是 VS Code 的入门详细讲解: 下载和安装…

使用Python绘制各种图表

1、折线图(Line Chart) import matplotlib.pyplot as plt # 数据 x [1, 2, 3, 4, 5] y [2, 4, 1, 3, 7] # 绘制折线图 plt.plot(x, y) plt.title(折线图示例) plt.xlabel(X轴) plt.ylabel(Y轴) plt.show() 2、柱状图(Bar…

算法专题四:前缀和

前缀和 一.一维前缀和(模板):1.思路一:暴力解法2.思路二:前缀和思路 二. 二维前缀和(模板):1.思路一:构造前缀和数组 三.寻找数组的中心下标:1.思路一:前缀和 四.除自身以外数组的乘积&#xff…

3、Git分支操作与团队协作

Git分支操作 1.什么是分支2. 分支的好处3. 分支的操作3.1 查看分支3.2 创建分支3.3 切换分支3.4 修改分支3.5 合并分支3.6 产生和解决冲突 4. 创建分支和切换分支图解5. Git团队协作机制团队内协作跨团队协作 均在git bash中进行操作。事先建好本地工作库 1.什么是分支 在版本…

GLTF 编辑器实现逼真3D动物毛发效果

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 要实现逼真的3D动物毛发效果,可以采用以下技术和方法&…

接口和抽象类

在Java编程语言中,抽象类和接口都是用于定义抽象概念的重要工具。它们都提供了一种方式来创建可重用的代码,并且都可以被其他类继承或实现。然而,尽管它们有一些相似之处,但也存在一些显著的区别。本文将探讨抽象类和接口的相同点…

Vue学习day_03

普通组件的注册 局部注册: 创建一个components的文件夹 在里面写上对应的.vue文件 在对应的vue里面写上对应的3部分 template写上对应的核心代码 盒子等 style 写上对应的css修饰 在App.vue里面进行引用 import 导包 格式是 import 起个名字 from 位置 在写一个component…

AutoSAR(基础入门篇)3.3-Autosar中RTE的数据一致性与Interface接口

目录 一、RTE的数据一致性 1、什么是数据一致性 2、数据一致性的实现机制 2.1、利用RTE管理<

3d导入模型怎样显示原本材质---模大狮模型网

要在导入3D模型时保留原本的材质&#xff0c;您可以尝试以下方法&#xff1a; 导入前检查文件格式&#xff1a;确保您所使用的3D软件支持导入模型的文件格式。不同的软件对文件格式的支持有所差异&#xff0c;选择正确的文件格式可以更好地保留原始材质。 使用正确的材质库&am…

【Python篇】python库讲解(wordcloud | jieba)

文章目录 &#x1f354;jieba库&#x1f354;wordcloud库&#x1f339;解释 &#x1f354;jieba库 jieba库是一个流行的中文分词工具&#xff0c;它基于统计算法和词频字典&#xff0c;能够将连续的汉字序列切割成有意义的词语。下面是对jieba库的简要理论说明&#xff1a; 分…

云计算基础、Issa、Pssa、Saas区别

一、了解云计算 云计算&#xff08;cloud computing&#xff09;是分布式计算的一种&#xff0c;指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序&#xff0c;然后&#xff0c;通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。云计算…

复数值神经网络可能是深度学习的未来

一、说明 复数这种东西,在人的头脑中似乎抽象、似乎复杂,然而,对于计算机来说,一点也不抽象,不复杂,那么,将复数概念推广到神经网络会是什么结果呢?本篇介绍国外的一些同行的尝试实践,请我们注意观察他们的进展。

【机组期末速成】指令系统|机器指令概述|操作数类型与操作类型|寻址方式|指令格式

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;计算机组成原理&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 目录 前言&#xff1a; 一、本章考点总览 二、考点分析 1、以下有关指令系统的说法中错误的是&#xff08; &#xff09;。 2…

python将Excel的每一个sheet页生成PDF文件

这里我们使用Excel应用导出PDF 使用win32com.client.Dispatch("Excel.Application")启动Excel使用excel.Workbooks.Open(excel文件的绝对路径)打开文件循环每一个sheet&#xff0c;使用.ExportAsFixedFormat(0, os.path.join(parent, f"pdf_data/{_sheet.Name}…

idea远程开发环境搭建

idea远程开发环境搭建 一、安装包下载二、环境准备2.1服务器端jdk、maven安装&#xff0c;代码下载略2.2JetBrainsClients下载配置 三、远程环境配置3.1 创建项目3.2 填写服务器连接信息![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4aa09073af5e4a66a5e83e7c5d1…

Unity 通过鼠标框选绘制矩形区域

鼠标拖动的同时绘制一块同等大小的区域&#xff1a;如下 using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 通过鼠标框选绘制矩形区域 /// </summary> /// public enum MouseType {left 0,right 1,middle 2 …

MySQL线上慢SQL问题分析处理小记

相同数据量表结构&#xff0c;线上执行12s 本地执行0.1s过程分析 1. 慢SQL信息 SELECT t1.id,t2.idFROM t_platform_target_standard_target_index t1LEFT JOIN t_platform_target_standard t2 ON t1.target_number t2.target_numberWHERE t1.delete_flag 0 AND t2.user_num …

基于STM32的光电传感器应用开发实例

基于STM32的光电传感器应用开发是一种常见的嵌入式系统应用&#xff0c;光电传感器可以用于检测物体的有无、位置、颜色、亮度等信息&#xff0c;被广泛应用于工业自动化、机器人技术、智能家居等领域。本文将介绍如何在STM32上进行光电传感器应用开发&#xff0c;并提供相应的…