JavaScript ã§ã® Base64 ãšã³ã³ãŒã/ãã³ãŒã: btoa()ãatob()ãUnicode
JavaScript ã§ã® Base64 ãšã³ã³ãŒãã£ã³ã°ãšãã³ãŒãã£ã³ã°
JavaScript ã«ã¯ãBase64 æååããšã³ã³ãŒãããã³ãã³ãŒãããããã®çµã¿èŸŒã¿ã®æ¹æ³ãããã€ããããŸãããã©ãŠã¶ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠããå Žåã§ããNode.js ãµãŒããŒãæ§ç¯ããŠããå Žåã§ããJSONãHTMLãURL ãªã©ã®ããã¹ãããŒã¹ã®åœ¢åŒã§ãã€ããªããŒã¿ãæ±ãã«ã¯ãBase64 ã®æäœæ¹æ³ãçè§£ããããšãäžå¯æ¬ ã§ãã
ãã©ãŠã¶ã§ã® btoa() ãš atob() ã®äœ¿çš
ãã©ãŠã¶ã® JavaScript ã§ Base64 ãæ±ãããã® 2 ã€ã®äžå¿çãªé¢æ°ã¯ãbtoa() ãš atob() ã§ãããããã®é¢æ°åã¯å€ãåœåèŠåã«åŸã£ãŠããŸã â btoa ã¯ãbinary to ASCIIãã®ç¥ã§ãatob ã¯ãASCII to binaryãã®ç¥ã§ãããããã¯äœå幎ãã®éããã¹ãŠã®äž»èŠãã©ãŠã¶ã§ãµããŒããããŠããŸããã
btoa() ã§ã®ãšã³ã³ãŒãã£ã³ã°
const originalString = 'Hello, world!';
const encoded = btoa(originalString);
console.log(encoded);
// Output: SGVsbG8sIHdvcmxkIQ==
atob() ã§ã®ãã³ãŒãã£ã³ã°
const base64String = 'SGVsbG8sIHdvcmxkIQ==';
const decoded = atob(base64String);
console.log(decoded);
// Output: Hello, world!
ã©ã¡ãã®é¢æ°ããLatin-1 æåïŒåæåã 1 ãã€ãã§è¡šãããïŒã®ã¿ãå«ãæååã§åäœããŸããããã¯éèŠãªå¶éã§ãããæ¬¡ã«èª¬æããŸãã
Unicode æåãšé ASCII æåã®åŠç
ããããèœãšã穎: btoa() ã¯ãçµµæåãäžåœèªæåãã¢ã¯ã»ã³ãä»ãæåãªã©ãLatin-1 ã®ç¯å²å€ã®æåãå«ãæååãæž¡ããããšãšã©ãŒãã¹ããŒããŸãã
btoa('Hello äœ å¥œ');
// Error: The string to be encoded contains characters outside of the Latin-1 range.
Unicode æååããšã³ã³ãŒãããã«ã¯ããŸãæååããã€ãã«å€æããŠããããã®ãã€ãããšã³ã³ãŒãããå¿
èŠããããŸããææ°ã®ã¢ãããŒãã§ã¯ãTextEncoder ãš TextDecoder API ã䜿çšããŸã:
function unicodeToBase64(str) {
const bytes = new TextEncoder().encode(str);
const binaryString = String.fromCharCode(...bytes);
return btoa(binaryString);
}
function base64ToUnicode(base64) {
const binaryString = atob(base64);
const bytes = Uint8Array.from(binaryString, (c) => c.charCodeAt(0));
return new TextDecoder().decode(bytes);
}
// Usage
const encoded = unicodeToBase64('Hello äœ å¥œ ð');
console.log(encoded);
// Output: SGVsbG8g5L2g5aW9IPCfj4A=
const decoded = base64ToUnicode(encoded);
console.log(decoded);
// Output: Hello äœ å¥œ ð
å€ãææ³ã§ã¯ encodeURIComponent ãš decodeURIComponent ã䜿çšããŸãããTextEncoder/TextDecoder ã®ã¢ãããŒãã®æ¹ãå
ç¢ã§ãæšå¥šãããææ°ã®ãœãªã¥ãŒã·ã§ã³ã§ãã
ãã€ããªããŒã¿ã®ãšã³ã³ãŒãã£ã³ã°ïŒArrayBufferïŒ
fetch ã FileReader ãªã©ã® API ãããã¡ã€ã«ãç»åãçã®ãã€ããªããŒã¿ãæ±ãå Žåãé垞㯠ArrayBuffer ãŸã㯠Uint8Array ãååŸããŸããããã Base64 ã«å€æããæ¹æ³ã¯æ¬¡ã®ãšããã§ã:
function arrayBufferToBase64(buffer) {
const bytes = new Uint8Array(buffer);
let binaryString = '';
for (let i = 0; i < bytes.length; i++) {
binaryString += String.fromCharCode(bytes[i]);
}
return btoa(binaryString);
}
function base64ToArrayBuffer(base64) {
const binaryString = atob(base64);
const bytes = new Uint8Array(binaryString.length);
for (let i = 0; i < binaryString.length; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes.buffer;
}
ãã©ãŠã¶ã§ãã¡ã€ã«ã Base64 ã«å€æãã
FileReader ã䜿çšããŠããŠãŒã¶ãŒãéžæãããã¡ã€ã«ã Base64 ããŒã¿ URL ã«å€æããå®å
šãªäŸã次ã«ç€ºããŸã:
function fileToBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = () => reject(new Error('Failed to read file'));
reader.readAsDataURL(file);
});
}
// Usage with a file input
document.querySelector('input[type="file"]').addEventListener('change', async (e) => {
const file = e.target.files[0];
try {
const dataUrl = await fileToBase64(file);
console.log(dataUrl); // data:image/png;base64,iVBORw0KGgo...
} catch (err) {
console.error('Conversion failed:', err);
}
});
Node.js ã§ã® Base64 ã®äœ¿çš
Node.js 㯠Base64 æäœçšã® Buffer ã¯ã©ã¹ãæäŸããŠããããã©ãŠã¶ã® btoa/atob ãããæè»ã§ããBuffer ã¯ã©ã¹ã¯ Unicode ãå«ããšã³ã³ãŒããšãã³ãŒããèªåçã«åŠçããè€æ°ã®ãšã³ã³ãŒã圢åŒããµããŒãããŸãã
åºæ¬çãªãšã³ã³ãŒãã£ã³ã°ãšãã³ãŒãã£ã³ã°
// Encode a string to Base64
const encoded = Buffer.from('Hello, world!').toString('base64');
console.log(encoded);
// Output: SGVsbG8sIHdvcmxkIQ==
// Decode a Base64 string back to text
const decoded = Buffer.from(encoded, 'base64').toString('utf-8');
console.log(decoded);
// Output: Hello, world!
Node.js ã§ã® Unicode ãµããŒã
ãã©ãŠã¶ã® btoa() ãšã¯ç°ãªããNode.js ã® Buffer 㯠Unicode ãã·ãŒã ã¬ã¹ã«åŠçããŸã:
const encoded = Buffer.from('Hello äœ å¥œ ð').toString('base64');
console.log(encoded);
// Output: SGVsbG8g5L2g5aW9IPCfj4A=
const decoded = Buffer.from(encoded, 'base64').toString('utf-8');
console.log(decoded);
// Output: Hello äœ å¥œ ð
ãã¡ã€ã«ã®èªã¿åããš Base64 ãžã®ãšã³ã³ãŒãã£ã³ã°
const fs = require('fs');
// Read a file and encode it to Base64
const buffer = fs.readFileSync('image.png');
const base64 = buffer.toString('base64');
const dataUrl = `data:image/png;base64,${base64}`;
Node.js ã§ã® Base64url ãšã³ã³ãŒãã£ã³ã°
Node.js 15.7.0 以éã§ã¯ãã€ãã£ãã® Base64url ãšã³ã³ãŒãã£ã³ã°ããµããŒãããŠããã+ ã - ã«ã/ ã _ ã«çœ®ãæããŠããã£ã³ã°ãçç¥ããŸã:
const encoded = Buffer.from('Hello, world!').toString('base64url');
console.log(encoded);
// Output: SGVsbG8sIHdvcmxkIQ (no padding)
const decoded = Buffer.from(encoded, 'base64url').toString('utf-8');
console.log(decoded);
// Output: Hello, world!
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé
å€§èŠæš¡ãªããŒã¿ã®å ŽåãBase64 æäœãç¹°ãè¿ããšé ããªãå¯èœæ§ããããŸããããã€ãã®ãã³ãã玹ä»ããŸã:
- Unicode æååã§ã¯æå倿ã§ã¯ãªã
TextEncoder/TextDecoderã䜿çšãã - Node.js ã§ã¯ã
Buffer.from()ã¯é«åºŠã«æé©åãããŠããŸã â æåå®è£ ãããåªå ããŠãã ãã - å¿ èŠãªå Žåãé€ãã倧ããªãã¡ã€ã«ã Base64 ã«å€æããªãããã«ããïŒã¹ããªãŒãã³ã°ãæ€èšããïŒ
- å€§èŠæš¡ãªããŒã¿ã»ããã§ã¯ãã¡ã€ã³ã¹ã¬ããã®ããããã³ã°ãé¿ããããã«ããã©ãŠã¶ã§
BlobãšFileReaderã®äœ¿çšãæ€èšãã
Base64 ãšã³ã³ãŒãã£ã³ã°ããªã³ã©ã€ã³ã§è©Šã
ç¡æã®ãªã³ã©ã€ã³ Base64 ãšã³ã³ãŒããšãã³ãŒãã䜿ã£ãŠããã©ãŠã¶ã§çŽæ¥ãšã³ã³ãŒããšãã³ãŒãã詊ããŠã¿ãŸããããã³ãŒãã£ã³ã°ã¯äžèŠã§ã â ããã¹ãã貌ãä»ããããã¡ã€ã«ãã¢ããããŒãããã ãã§ãBase64 ã®çµæãå³åº§ã«åŸãããŸãã