」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在處理 UTF-8 編碼的同時在 JavaScript 中解碼 Base64 字串?

如何在處理 UTF-8 編碼的同時在 JavaScript 中解碼 Base64 字串?

發佈於2024-11-08
瀏覽:936

How to Decode Base64 Strings in JavaScript While Handling UTF-8 Encoding?

使用 JavaScript atob 解碼 Base64 函數:處理 UTF-8

JavaScript 的 atob() 函數旨在解碼 Base64 編碼的字串。使用者在解碼 UTF-8 編碼字串時可能會遇到問題,導致產生 ASCII 編碼字元而不是正確的 UTF-8 表示形式。

挑戰:理解 Unicode 問題

Base64 需要二進位資料作為輸入,JavaScript將字元佔據一個位元組的字串視為二進位資料。然而,在 UTF-8 編碼的字串中,字元佔用超過 1 個位元組時,會在編碼過程中觸發異常。

解決方案1:二進位互通性

建議的修復方法是對二進位字串進行編碼和解碼:

將UTF-8 編碼為二進位

function toBinary(string) {
  const codeUnits = new Uint16Array(string.length);
  for (let i = 0; i 

將二進位解碼為 UTF-8

function fromBinary(encoded) {
  const binary = atob(encoded);
  const bytes = new Uint8Array(binary.length);
  for (let i = 0; i 

此解決方案將原始 UTF-8 字串轉換為二進位表示形式,保留 UTF-16 編碼(JavaScript 中的本機表示形式)。

解決方案2:ASCII Base64 互通性

專注於UTF-8 互通性的替代解決方案是維護純文字Base64 字串:

Encoding UTF-8 至 Base64

function b64EncodeUnicode(str) {    
  return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
    function toSolidBytes(match, p1) {
      return String.fromCharCode('0x'   p1);
  }));
}

解碼 Base64 為 UTF-8

function b64DecodeUnicode(str) {
  return decodeURIComponent(atob(str).split('').map(function(c) {
    return '%'   ('00'   c.charCodeAt(0).toString(16)).slice(-2);
  }).join(''));
}

此解決方案可有效處理 UTF-8 編碼的字串,而不改變其表示形式。

TypeScript 支援

// Encoding UTF-8 ⇢ base64

function b64EncodeUnicode(str) {
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
        return String.fromCharCode(parseInt(p1, 16))
    }))
}

// Decoding base64 ⇢ UTF-8

function b64DecodeUnicode(str) {
    return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {
        return '%'   ('00'   c.charCodeAt(0).toString(16)).slice(-2)
    }).join(''))
}

歷史解決方案(已棄用)

function utf8_to_b64( str ) {
  return window.btoa(unescape(encodeURIComponent( str )));
}

function b64_to_utf8( str ) {
  return decodeURIComponent(escape(window.atob( str )));
}

雖然仍然有效,但這種方法現在在現代瀏覽器中已被棄用。

最新教學 更多>
  • 了解命令式程式設計和聲明式程式設計之間的區別
    了解命令式程式設計和聲明式程式設計之間的區別
    當我剛開始學習React時,我的老師說:「JavaScript是命令式編程,而React是聲明式編程。」然而,一開始這對我來說不太有意義。因此,我決定將其分解以更好地理解其中的差異。 將命令式和聲明式程式設計與披薩進行比較? 為了更容易理解,讓我們來比較一下這兩種烹飪方法。 ...
    程式設計 發佈於2024-11-08
  • 如何使用 JPA 和 Hibernate 以 UTC 格式儲存日期/時間和時間戳記?
    如何使用 JPA 和 Hibernate 以 UTC 格式儲存日期/時間和時間戳記?
    使用JPA 和Hibernate 以UTC 格式儲存日期/時間和時間戳在Java Persistence API (JPA) 和Hibernate 中,管理日期/時間不同時區的時間戳值可能是一個挑戰。為了確保 UTC(協調世界時)時間的一致儲存和檢索,正確配置框架至關重要。 考慮提供的附註解的 JP...
    程式設計 發佈於2024-11-08
  • java.lang.RuntimeException 和 java.lang.Exception 之間的主要區別是什麼?
    java.lang.RuntimeException 和 java.lang.Exception 之間的主要區別是什麼?
    揭示java.lang.RuntimeException 和java.lang.Exception 的獨特本質在Java 異常領域內,兩個經常遇到的異常類別出現:java.lang.RuntimeException 和java.lang.Exception。為了有效地理解異常處理的複雜性,剖析它們之...
    程式設計 發佈於2024-11-08
  • 為什麼嵌入框陰影在透明背景的圖片上消失?
    為什麼嵌入框陰影在透明背景的圖片上消失?
    了解圖像上的插入框陰影問題在網頁設計中,使用插入框陰影在元素內創建深度和尺寸是一種常見技術。然而,在處理包含圖像的容器時,事情並不總是那麼簡單。當嵌入框陰影似乎在嵌入影像上消失時,就會出現問題。 隱形陰影的情況考慮原始問題中提供的範例:body { background-color: #0000...
    程式設計 發佈於2024-11-08
  • 如何在 ReactJS 中維護懸停狀態:解決事件註冊問題
    如何在 ReactJS 中維護懸停狀態:解決事件註冊問題
    在ReactJS 中維護懸停狀態:解決事件註冊問題使用內聯樣式時,您會遇到ReactJS 中懸停和活動事件的問題,因為onMouseEnter 和onMouseLeave 方法被證明是不可靠的。 要解決此問題,請考慮使用下列事件處理程序之一:onMouseDownonMouseEnter onMou...
    程式設計 發佈於2024-11-08
  • 如何在 JavaScript 中準確檢查 Null 值和空字串?
    如何在 JavaScript 中準確檢查 Null 值和空字串?
    檢查 JavaScript 中的 Null 值在 JavaScript 中,確定值是否為 null 有時會令人困惑。為了提供更深入的理解,本文將深入研究在 JavaScript 情境中偵測空值的細節。 檢查空值提供的程式碼片段旨在檢查跨多個變數的null 值:if (pass == null || ...
    程式設計 發佈於2024-11-08
  • 在 Golang 中建立 Google Drive 下載器(第 1 部分)
    在 Golang 中建立 Google Drive 下載器(第 1 部分)
    介绍 在本教程中,我们将构建一个功能强大的下载器,允许从Google Drive和其他云提供商下载文件。借助 Golang 高效的并发模式,您将能够同时管理多个下载、流式传输大文件并实时跟踪进度。无论您是下载一些小文件还是处理大型数据集,该项目都将展示如何构建可扩展且强大的下载器,...
    程式設計 發佈於2024-11-08
  • PHP 4 快速部署
    PHP 4 快速部署
    Servbay 已成為高效配置開發環境的領先工具。在本指南中,我們將引導您完成快速、安全地部署 PHP 8.1 的過程,以展示 Servbay 對簡化部署的承諾。 先決條件 確保您的電腦上安裝了 Servbay。您可以從 Servbay 官方網站輕鬆下載。安裝過程人性化;只需按照安...
    程式設計 發佈於2024-11-08
  • 如何繞過驗證碼
    如何繞過驗證碼
    No matter how many times people wrote that the captcha has outlived itself long time ago and no longer works as effectively as its developers would ha...
    程式設計 發佈於2024-11-08
  • 使用 super 呼叫超類別建構函數
    使用 super 呼叫超類別建構函數
    子類別可以使用 super(parameter-list);. 形式來呼叫其超類別定義的建構函數 parameter-list 必須指定超類別建構子所需的參數。 子類別建構子中執行的第一條語句必須始終是 super(); (或 super(parameter-list); 如果需要傳遞參數). ...
    程式設計 發佈於2024-11-08
  • 你能比較 C++ 中不同容器的迭代器嗎?
    你能比較 C++ 中不同容器的迭代器嗎?
    比較來自不同容器的迭代器:一個警示故事在C 中,迭代器提供了一個強大的遍歷集合的機制。然而,在使用來自不同容器的迭代器時,重要的是要意識到這些限制。 比較不同容器的迭代器是否合法的問題經常出現。考慮以下範例:std::vector<int> foo; std::vector<int...
    程式設計 發佈於2024-11-08
  • 幫助 FastAPI:如何為文件翻譯做出貢獻
    幫助 FastAPI:如何為文件翻譯做出貢獻
    One of the great features of FastAPI is its great documentation ?. But wouldn't it be better if more people around the world had access to this docume...
    程式設計 發佈於2024-11-08
  • 如何使用 CSS 和 AngularJS 建立垂直 HTML 表格?
    如何使用 CSS 和 AngularJS 建立垂直 HTML 表格?
    垂直HTML 表格創建具有垂直行的HTML 表格提供了一種獨特的方式來顯示數據,行標題位於左側而不是頂部。要實現此目的,可以套用 CSS 樣式來轉換表格的結構。 CSS 樣式若要將表格行呈現為垂直列,請遵循下列CSS 規則可使用:tr { display: block; float: lef...
    程式設計 發佈於2024-11-08
  • 透過自訂 Hooks 在 React 中重複使用邏輯:實用指南
    透過自訂 Hooks 在 React 中重複使用邏輯:實用指南
    自訂鉤子是React 中的一項強大功能,與React 內建鉤子不同,它用於更具體的目的,並且它是透過將常見功能封裝到獨立函數中來完成的。自訂掛鉤促進可重複使用性、改進元件組織並整體增強程式碼可維護性。 在本指南中,我們將深入探討使用自訂鉤子的目的,以了解創建自訂鉤子的基礎知識以及如何使用其他元件。...
    程式設計 發佈於2024-11-08
  • 使用 ReactJS 建立免費的 AI 圖像生成器
    使用 ReactJS 建立免費的 AI 圖像生成器
    开发者们大家好, 今天,我将向您展示如何使用 ReactJS 创建图像生成器,并且完全可以免费使用,这要感谢黑森林实验室和 Together AI。 第 1 步:设置项目 在本教程中,我们将使用 Vite 来初始化应用程序并使用 Shadcn 来初始化 UI。我假设您已经设置了项目并...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3