JS如何實現(xiàn)Base64編碼和解碼(及中文亂碼問題)
更新時間:2023年10月12日 10:52:00 作者:一顆不甘墜落的流星
這篇文章主要給大家介紹了關于JS如何實現(xiàn)Base64編碼和解碼及中文亂碼問題的相關資料,Base64編碼是一種常用的將二進制數(shù)據(jù)轉換為文本數(shù)據(jù)的方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
一、原生實現(xiàn)
- JavaScript 定義了兩個與 Base64 相關的全局方法。
1. btoa():字符串或二進制值轉為 Base64 編碼。
2. atob():把 Base64 編碼轉為原來的字符。
- 遇到中文編碼需要先做一次 URI 組件編碼或對解碼后的內容進行 URI 解碼
1. encodeURIComponent():結合 btoa 使用
2. decodeURIComponent():結合 atob 使用
- 示例:Base64 編碼
// btoa() 相當于 window.btoa(),encodeURIComponent 同理 const str = 'test' const encode = btoa(encodeURIComponent(str)) console.log(encode) // dGVzdA==
- 示例:Base64 解碼
// atob() 相當于 window.atob(),decodeURIComponent 同理 const str = 'dGVzdA==' const decode = decodeURIComponent(atob(str)) console.log(decode) // test
- 中文亂碼處理方法:
const Base64 = { encode(str) { // 首先,我們使用 encodeURIComponent 來獲得百分比編碼的UTF-8,然后我們將百分比編碼轉換為原始字節(jié),最后存儲到btoa里面 return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) { return String.fromCharCode(Number('0x' + p1)); })); }, decode(str) { // 過程:從字節(jié)流到百分比編碼,再到原始字符串 return decodeURIComponent(atob(str).split('').map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); } } let encoded = Base64.encode("一顆不甘墜落的流星"); // "5LiA6aKX5LiN55SY5Z2g6JC955qE5rWB5pif" let decoded = Base64.decode(encoded); // "一顆不甘墜落的流星"
二、插件實現(xiàn)
- 按照 Base64 插件:編解碼:
js-base64
,判斷是否是Base64編碼格式:is-base64
npm i js-base64 npm i is-base64
- 插件使用
import isBase64 from 'is-base64'; import { Base64 } from 'js-base64'; // 封裝解碼函數(shù) const base64ToStr = (base64Str: string): string => { if (isBase64(base64Str)) { return Base64.decode(base64Str); } return base64Str; }; // 封裝編碼函數(shù) export const strToBase64 = (str: string): string => Base64.encode(str); console.log(strToBase64('一顆不甘墜落的流星')) // 5LiA6aKX5LiN55SY5Z2g6JC955qE5rWB5pif console.log(base64ToStr('5LiA6aKX5LiN55SY5Z2g6JC955qE5rWB5pif')) // 一顆不甘墜落的流星
總結
到此這篇關于JS如何實現(xiàn)Base64編碼和解碼及中文亂碼問題的文章就介紹到這了,更多相關JS Base64編碼和解碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
javascript中alert()與console.log()的區(qū)別
我們在做js調試的時候使用 alert 可以顯示信息,調試程序,alert 彈出窗口會中斷程序, 如果要在循環(huán)中顯示信息,手點擊關閉窗口都累死。而且 alert 顯示對象永遠顯示為[object ]。 自己寫的 log 雖然可以顯示一些 object 信息,但很多功能支持都沒有 console 好2015-08-08