”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > How to Decode Base64 Strings in JavaScript While Handling UTF-8 Encoding?

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

发布于2024-11-08
浏览:276

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

Decode Base64 Using JavaScript atob Function: Handling UTF-8

JavaScript's atob() function is designed to decode base64-encoded strings. Users may encounter issues when decoding UTF-8 encoded strings, resulting in ASCII-encoded characters instead of proper UTF-8 representation.

Challenge: Understanding the Unicode Problem

Base64 expects binary data as input, and JavaScript considers strings with characters occupying one byte as binary data. Characters occupying more than one byte in UTF-8 encoded strings, however, trigger exceptions during encoding.

Solution 1: Binary Interoperability

The recommended fix is to encode to and decode binary strings:

Encoding UTF-8 to Binary

function toBinary(string) {
  const codeUnits = new Uint16Array(string.length);
  for (let i = 0; i < codeUnits.length; i++) {
    codeUnits[i] = string.charCodeAt(i);
  }
  return btoa(String.fromCharCode(...new Uint8Array(codeUnits.buffer)));
}

Decoding Binary to UTF-8

function fromBinary(encoded) {
  const binary = atob(encoded);
  const bytes = new Uint8Array(binary.length);
  for (let i = 0; i < bytes.length; i++) {
    bytes[i] = binary.charCodeAt(i);
  }
  return String.fromCharCode(...new Uint16Array(bytes.buffer));
}

This solution converts the original UTF-8 string to a binary representation, preserving UTF-16 encoding, a native representation in JavaScript.

Solution 2: ASCII Base64 Interoperability

An alternative solution focused on UTF-8 interoperability is to maintain plaintext base64 strings:

Encoding UTF-8 to Base64

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

Decoding Base64 to UTF-8

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

This solution efficiently handles UTF-8 encoded strings without altering their representation.

TypeScript Support

// 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(''))
}

Historical Solution (Deprecated)

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

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

While still functional, this approach is now deprecated in modern browsers.

最新教程 更多>
  • 项目 注意字符串连接性能
    项目 注意字符串连接性能
    1。使用运算符 ( ) 连接字符串: 使用运算符连接字符串对于少量连接来说很方便,但由于字符串的不变性,在大规模操作时会出现性能问题。 每次创建新字符串时,都会复制所有先前字符串的内容,从而导致大型连接的时间成二次方。 不正确的示例(与 重复连接): public String criaFatura...
    编程 发布于2024-11-08
  • 如何解决 Wamp 服务器中的橙色图标问题:识别服务故障并对其进行故障排除
    如何解决 Wamp 服务器中的橙色图标问题:识别服务故障并对其进行故障排除
    解决 Wamp Server 中顽固的橙色图标在 Web 开发领域,WampServer 图标旁边出现橙色图标可以成为令人沮丧的路障。此持久图标通常表示启动 Apache 或 MySQL 服务失败,使您陷入开发困境。识别罪魁祸首:Apache 或 MySQL?确定哪个服务导致了问题,单击 wampm...
    编程 发布于2024-11-08
  • 网络基础知识
    网络基础知识
    In the world of system design, networks are the glue that binds different components together. Whether you're building a web application, a distribute...
    编程 发布于2024-11-08
  • Python 初学者教程:学习基础知识
    Python 初学者教程:学习基础知识
    欢迎来到Python编程的奇妙世界!如果您是编码新手,请系好安全带,因为 Python 是最简单但最强大的语言之一。无论您是想自动执行繁琐的任务、构建 Web 应用程序还是深入研究数据科学,Python 都是您成功编码的门户。 在本初学者指南中,我们将引导您完成 Python 的基本构建块,确保您准...
    编程 发布于2024-11-08
  • 如何提取MySQL字符串中第三个空格之后的子字符串?
    如何提取MySQL字符串中第三个空格之后的子字符串?
    MySQL:提取字符串中的第三个索引要使用 MySQL 定位字符串中第三个空格的索引,一种方法是利用 SUBSTRING_INDEX 函数。此函数可以提取直到指定分隔符(在本例中为空格字符)的子字符串。要隔离第三个空格,您可以使用两个嵌套的 SUBSTRING_INDEX 调用。内部函数调用检索从字...
    编程 发布于2024-11-08
  • 如果无法访问分配的空间,为什么要为 ArrayList 设置初始大小?
    如果无法访问分配的空间,为什么要为 ArrayList 设置初始大小?
    了解 ArrayList 中的初始大小在 Java 中,ArrayList 是动态数组,可以根据需要增长和缩小。可以使用构造函数 new ArrayList(10) 指定 ArrayList 的初始大小,其中 10 表示所需的容量。但是,设置初始大小并不授予立即访问已分配空间的权限。与传统数组不同,...
    编程 发布于2024-11-08
  • 如何在不改变系统设置的情况下使Python 2.7成为Linux中的默认版本?
    如何在不改变系统设置的情况下使Python 2.7成为Linux中的默认版本?
    Linux 中的默认 Python 版本:选择 Python 2.7在 Linux 系统上运行多个 Python 版本是一种常见的情况。然而,浏览默认版本有时可能会很困难。本文讨论如何在终端上键入“python”命令时将 Python 2.7 设为默认版本。默认 Python 更改的评估更改默认 P...
    编程 发布于2024-11-08
  • 如何根据多个条件对 Go 中具有嵌套切片的结构切片进行排序?
    如何根据多个条件对 Go 中具有嵌套切片的结构切片进行排序?
    使用嵌套切片对结构体切片进行排序在 Go 中,您可以使用内置的排序包对自定义结构体切片进行排序。考虑以下代码,它定义了两个结构体 Parent 和 Child,表示父子关系:type Parent struct { id string children []Child }...
    编程 发布于2024-11-08
  • C# | Web Api 的提示和技巧
    C# | Web Api 的提示和技巧
    笔记 您可以查看我个人网站上的其他帖子:https://hbolajraf.net Web Api 的提示和技巧 用 C# 构建 Web API 是创建可扩展且高效的后端服务的强大方法。以下是一些提示和技巧,可帮助您充分利用 C# Web API 开发。 1.使用...
    编程 发布于2024-11-08
  • JavaScript 模块
    JavaScript 模块
    现在我们不再将所有 JS 写在一个文件中并发送给客户端。 今天,我们将代码编写到模块中,这些模块之间共享数据并且更易于维护。 约定是使用驼峰命名法命名模块。 我们甚至可以通过 npm 存储库将第 3 方模块包含到我们自己的代码中,例如 jquery、react、webpack、babel 等。 最...
    编程 发布于2024-11-08
  • 适合前端开发人员的最佳 JavaScript 框架
    适合前端开发人员的最佳 JavaScript 框架
    要开始您作为前端开发人员的旅程,选择正确的 JavaScript 框架可以显着影响您的学习曲线和项目成功。以下是每个前端开发人员都应该选择的一些最佳 JavaScript 框架。 1. 反应 React 是一个广泛使用的 JavaScript 库,用于构建用户界面,主要关注单页面应用...
    编程 发布于2024-11-08
  • 如何在 Python 中禁用 .pyc 文件生成?
    如何在 Python 中禁用 .pyc 文件生成?
    如何阻止Python生成.pyc文件Python通常将源代码(.py文件)编译为字节码(.pyc文件)以提高执行速度。但是,您可能会遇到希望执行解释器而不创建 .pyc 文件的情况。根据“What's New in Python 2.6 - Interpreter Changes”,您可以禁...
    编程 发布于2024-11-08
  • Go vs. Java vs. .NET:企业综合性能和开发时间评估
    Go vs. Java vs. .NET:企业综合性能和开发时间评估
    In today’s fast-paced software development landscape, choosing the right programming language is crucial for enterprise success. With languages like ...
    编程 发布于2024-11-08
  • 如何可靠地确定 JavaScript 对象是否是 DOM 元素?
    如何可靠地确定 JavaScript 对象是否是 DOM 元素?
    如何在 JavaScript 中确定 DOM 对象状态在 JavaScript 中,区分 DOM(文档对象模型)对象和常规 JavaScript 对象至关重要对于某些操作。虽然检查 tagName 属性的传统方法在大多数情况下都有效,但在某些不强制执行只读属性的浏览器中可能会失败。综合解决方案要解决...
    编程 发布于2024-11-08
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3