如何在 JavaScript 中将字符串编码为 Base64?
我有一个 PHP 脚本,可以将 PNG 图像编码为 Base64 字符串。
我想使用 JavaScript 做同样的事情。 我知道如何打开文件,但我不知道如何进行编码。 我不习惯使用二进制数据。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(30)
您可以使用
btoa()
和atob()
与 Base64 编码相互转换。关于这些函数接受/返回的内容,注释中似乎存在一些混乱,因此......
btoa()
接受一个“字符串”,其中每个字符代表一个 8 位字节 - 如果您通过包含无法用 8 位表示的字符的字符串,它可能会损坏。 如果您实际上将字符串视为字节数组,那么这不是问题,但如果您尝试做其他事情,那么您必须先对其进行编码。atob()
返回一个“字符串”,其中每个字符代表一个 8 位字节 - 也就是说,其值将在0
和0xff< 之间/代码>。 这不意味着它是 ASCII - 大概如果您使用此函数,您希望使用二进制数据而不是文本。
另请参阅:
这里的大多数评论都已经过时了。 您可能可以同时使用
btoa()
和atob()
,除非您支持非常过时的浏览器。检查此处:
You can use
btoa()
andatob()
to convert to and from base64 encoding.There appears to be some confusion in the comments regarding what these functions accept/return, so…
btoa()
accepts a “string” where each character represents an 8-bit byte – if you pass a string containing characters that can’t be represented in 8 bits, it will probably break. This isn’t a problem if you’re actually treating the string as a byte array, but if you’re trying to do something else then you’ll have to encode it first.atob()
returns a “string” where each character represents an 8-bit byte – that is, its value will be between0
and0xff
. This does not mean it’s ASCII – presumably if you’re using this function at all, you expect to be working with binary data and not text.See also:
Most comments here are outdated. You can probably use both
btoa()
andatob()
, unless you support really outdated browsers.Check here:
从此处:
另外,搜索 "JavaScript base64编码" 出现了很多其他选项,上面是第一个。
From here:
Also, search for "JavaScript base64 encoding" turns up a lot of other options, and the above was the first one.
Internet Explorer 10+
跨浏览器
jsFiddle
使用 Node.js
在 Node.js 中,您可以将普通文本编码为Base64 与 Buffer.fromString
以下是解码 Base64 编码字符串的方法:
使用 Dojo.js
使用 dojox.encoding.base64 编码字节数组:
解码 Base64 编码字符串:
Bower install angular-base64
Internet Explorer 10+
Cross-Browser
jsFiddle
With Node.js
In Node.js you can encode normal text to base64 with Buffer.fromString
And here is how you decode base64 encoded strings:
With Dojo.js
To encode an array of bytes using dojox.encoding.base64:
To decode a Base64-encoded string:
Bower install angular-base64
Sunny 的代码很棒但它在 Internet Explorer 7 中由于引用“this”而中断。 通过用“Base64”替换此类引用来修复此问题:
Sunny's code is great except it breaks in Internet Explorer 7 because of references to "this". It was fixed by replacing such references with "Base64":
根据已接受答案下方的评论(SET 和 Stefan Steiger),这里快速总结了如何在不需要库的情况下将字符串编码到 Base64 或从 Base64 解码。
纯 JavaScript 演示
。
jQuery Demo (使用 jQuery 库进行显示,但不进行编码/解码)
另请参阅:
Base64 - MDN 网络文档
确定 JavaScript 中的字符串是否采用 Base64 格式
From the comments (by SET and Stefan Steiger) below the accepted answer, here is a quick summary of how to encode/decode a string to/from Base64 without need of a library.
Pure JavaScript Demo
.
jQuery Demo (uses the jQuery library for display, but not for encode/decode)
ALSO SEE:
Base64 - MDN Web Docs
Determine if a string is in Base64 in JavaScript
您可以使用
btoa
(到 Base64)和atob
(从 Base64)。对于 Internet Explorer 9 及更低版本,请尝试 jquery-base64 插件:
You can use
btoa
(to Base64) andatob
(from Base64).For Internet Explorer 9 and below, try the jquery-base64 plugin:
如果你使用 Node.js,你可以这样做:
If you use Node.js, you can do this:
_utf8_decode
的两种实现都存在一些错误。 由于var
语句的错误使用,c1
和c2
被指定为全局变量,并且c3
未初始化或根本没有宣布。它可以工作,但是这些变量将覆盖该函数之外任何现有的同名变量。
这是一个不会执行此操作的版本:
There are a couple of bugs in both implementations of
_utf8_decode
.c1
andc2
are assigned as global variables due to broken use of thevar
statement, andc3
is not initialized or declared at all.It works, but these variables will overwrite any existing ones with the same name outside this function.
Here's a version that won't do this:
对于较新的浏览器,您可以使用以下内容。
对于 Node.js,您可以使用以下代码将字符串、Buffer 或 Uint8Array 编码为字符串,以及从字符串、Buffer 或 Uint8Array 解码为 Buffer。
For newer browsers you can use the followings.
For Node.js you can use the following to encode string, Buffer, or Uint8Array to string, and decode from string, Buffer, or Uint8Array to Buffer.
这个问题及其答案为我指明了正确的方向。
特别是对于 Unicode,atob 和 btoa 不能用于“普通”,而现在一切都是 Unicode...
直接来自 Mozilla,两个不错的用于此目的的函数。
内部使用 Unicode 和 HTML 标签进行测试:
与使用自定义 JavaScript 函数的原始 Base64 解码相比,这些函数的执行速度快如闪电,因为 btoa 和 atob 在解释器外部执行。
如果您可以忽略旧的 Internet Explorer 和旧的手机(例如 iPhone 3?),这应该是一个很好的解决方案。
This question and its answers pointed me in the right direction.
Especially with Unicode, atob and btoa can not be used "vanilla" and these days everything is Unicode...
Directly from Mozilla, two nice functions for this purpose.
Tested with Unicode and HTML tags inside:
These functions will perform lightning fast in comparison to raw Base64 decoding using a custom JavaScript function as btoa and atob are executed outside the interpreter.
If you can ignore old Internet Explorer and old mobile phones (like iPhone 3?) this should be a good solution.
基本上我刚刚清理了 原始代码有点,所以 JSLint 不会抱怨那么多,我使注释中标记为私有的方法实际上成为私有的。 我还在自己的项目中添加了两个我需要的方法,即decodeToHex和encodeFromHex。
代码:
Basically I've just cleaned up the original code a little so JSLint doesn't complain quite as much, and I made the methods marked as private in the comments actually private. I also added two methods I needed in my own project, namely
decodeToHex
andencodeFromHex
.The code:
请注意,这不适合原始 Unicode 字符串! 请参阅此处的 Unicode 部分。
编码语法
var generatedData = window.btoa(stringToEncode);
解码语法
var generatedData = window.atob(encodedData);
Please note that this is not suitable for raw Unicode strings! See the Unicode section here.
Syntax for encoding
var encodedData = window.btoa(stringToEncode);
Syntax for decoding
var decodedData = window.atob(encodedData);
我手动将这些编码和解码方法重写为模块化格式,以实现跨平台/浏览器兼容性以及真正的私有范围,并使用
btoa
和atob
如果它们的存在是由于速度而不是利用自己的编码:https://gist.github .com/Nijikokun/5192472
用法:
I have rewritten these encoding and decoding methods by hand with the exception of the hexadecimal one into a modular format for cross-platform / browser compatibility and also with real private scoping, and uses
btoa
andatob
if they exist due to speed rather than utilize its own encoding:https://gist.github.com/Nijikokun/5192472
Usage:
要使 Base64 编码的字符串 URL 友好,在 JavaScript 中,您可以执行以下操作:
另请参阅此 Fiddle:http: //jsfiddle.net/magikMaker/7bjaT/
To make a Base64 encoded String URL friendly, in JavaScript you could do something like this:
See also this Fiddle: http://jsfiddle.net/magikMaker/7bjaT/
如果您需要对 HTML 图像对象进行编码,您可以编写一个简单的函数,例如:
通过 id 获取图像的 Base64 编码:
更多是 此处。
If you need to encode an HTML image object, you can write a simple function like:
To get the Base64 encoding of the image by id:
More is here.
2022 弃用警告更新
我在 vscode 上看到弃用警告
经过更多搜索后,我发现此问题表示它尚未弃用
https://github.com/microsoft/TypeScript/issues/45566
因此,解决 Web JS 上的弃用警告的方法是使用
window.btoa
并且警告将会消失。
2022 deprecation warning update
I saw deprecation warning on my vscode
After searching a bit more, I found this issue that says it isn't deprecated
https://github.com/microsoft/TypeScript/issues/45566
so the solution to the deprecation warning on web JS, use
window.btoa
and the warning will disappear.
您可以使用
window.btoa
和window.atob
...可能使用 MDN 的方式可以最好地完成您的工作...还接受 Unicode...使用这两个简单的函数:
You can use
window.btoa
andwindow.atob
...Probably using the way which MDN is can do your job the best... Also accepting Unicode... using these two simple functions:
我的一个项目需要将 UTF-8 字符串编码为 Base64。 这里的大多数答案在转换为 UTF-8 时似乎都无法正确处理 UTF-16 代理对,因此,为了完整起见,我将发布我的解决方案:
请注意,代码尚未经过彻底测试。 我测试了一些输入,包括诸如
strToUTF8Base64('衠衢蠩蟏')
之类的内容,并与在线编码工具 (https://www.base64encode.org/)。I needed encoding of an UTF-8 string as Base64 for a project of mine. Most of the answers here don't seem to properly handle UTF-16 surrogate pairs when converting to UTF-8 so, for completion sake, I will post my solution:
Note that the code is not thoroughly tested. I tested some inputs, including things like
strToUTF8Base64('衠衢蠩蠨')
and compared with the output of an online encoding tool (https://www.base64encode.org/).我宁愿使用 CryptoJS 中的 Base64 编码/解码方法最流行的标准和安全加密算法库,使用最佳实践和模式在 JavaScript 中实现。
I'd rather use the Base64 encode/decode methods from CryptoJS, the most popular library for standard and secure cryptographic algorithms implemented in JavaScript using best practices and patterns.
这是
window.atob
+window.btoa
的缩小版填充:来自 https://github.com/MaxArt2501/base64-js/blob/master/base64.js
Here is a minified polyfill for
window.atob
+window.btoa
:Full version from https://github.com/MaxArt2501/base64-js/blob/master/base64.js
使用 js-base64 库作为
Use the js-base64 library as
这是 @user850789 的 AngularJS Factory 版本:
Here is an AngularJS Factory version of @user850789's one:
好吧,如果您使用 Dojo。 它为我们提供了直接编码或解码为 Base64 的方法。
试试这个:
要使用 dojox.encoding.base64 对字节数组进行编码:
要解码 Base64 编码的字符串:
Well, if you are using Dojo. It gives us direct way to encode or decode into Base64.
Try this:
To encode an array of bytes using dojox.encoding.base64:
To decode a Base64-encoded string:
虽然需要做更多的工作,但如果您想要高性能的本机解决方案,可以使用一些 HTML5 函数。
如果您可以将数据放入
Blob
,那么您可以使用 FileReader.readAsDataURL( ) 函数来获取data://
URL 并截掉它的前面以获取 Base64 数据。但是,您可能需要进行进一步的处理才能对数据进行 urldecode,因为我不确定
+
字符是否针对data://
URL 进行了转义,但这应该是很微不足道的。While a bit more work, if you want a high performance native solution there are some HTML5 functions you can use.
If you can get your data into a
Blob
, then you can use the FileReader.readAsDataURL() function to get adata://
URL and chop off the front of it to get at the Base64 data.You may have to do further processing however to urldecode the data, as I'm not sure whether
+
characters are escaped or not for thedata://
URL, but this should be pretty trivial.这是
atob 的实时演示 ()
和btoa()
JavaScript 内置函数:Here is a LIVE DEMO of
atob()
andbtoa()
JavaScript built-in functions:当我使用时
我得到:
我找到了文档,Unicode 字符串,提供了如下解决方案。
When I use
I get:
I found documentation, Unicode strings, was providing a solution as below.
对于我的项目,我仍然需要支持 IE7 并使用大输入进行编码。
根据 Joe Dyndale 提出的代码以及 Marius 评论中的建议,可以通过使用数组而不是字符串构造结果来提高 IE7 的性能。
这是编码的示例:
For my project I still need to support IE7 and work with large input to encode.
Based on the code proposed by Joe Dyndale and as suggested in comment by Marius, it is possible to improve the performance with IE7 by constructing the result with an array instead of a string.
Here is the example for encode:
没有
btoa
中间步骤的 JavaScript(无库)在问题标题中,您写了有关字符串转换的内容,但在问题中您讨论了二进制数据(图片),因此这里有一个函数,可以从以下位置开始进行正确的转换PNG图片二进制数据(详细信息和反转转换在此处)。
JavaScript without the
btoa
middlestep (no library)In the question title you write about string conversion, but in the question you talk about binary data (picture) so here is a function which makes a proper conversion starting from PNG picture binary data (details and reversal conversion are here).
这是编码为 base64url 的辅助函数:
Here is helper funktion to encode to base64url:
您可以在浏览器中使用 btoa()/atob(),但需要进行一些改进,如下所述 https://base64tool.com/uncaught-domexception-btoa-on-window/ 以及 https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa 用于 UTF 字符串支持!
You can use btoa()/atob() in browser, but some improvements required, as described here https://base64tool.com/uncaught-domexception-btoa-on-window/ and there https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa for UTF strings support!