PHP Conference Japan 2024

base64_encode

(PHP 4, PHP 5, PHP 7, PHP 8)

base64_encode使用 MIME base64 編碼資料

描述

base64_encode(字串 $string): 字串

使用 base64 編碼給定的 字串

此編碼旨在使二進位資料能夠通過非 8 位元清除的傳輸層(例如郵件本文)進行傳輸。

Base64 編碼的資料佔用空間比原始資料多約 33%。

參數

字串

要編碼的資料。

回傳值

編碼後的資料,以字串形式傳回。

範例

範例 #1 base64_encode() 範例

<?php
$str
= 'This is an encoded string';
echo
base64_encode($str);
?>

上述範例將輸出

VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==

參見

新增筆記

使用者貢獻筆記 32 則筆記

265
gutzmer at usa dot net
13 年前
對於任何對「base64url」變體編碼感興趣的人,您可以使用這對函數

<?php
function base64url_encode($data) {
return
rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function
base64url_decode($data) {
return
base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
?>
34
Rasmus Schultz
6 年前
在 PHP 7 中,base64_decode() 的填充問題已不存在 - 以下完全沒問題

function base64_encode_url($string) {
return str_replace(['+','/','='], ['-','_',''], base64_encode($string));
}

function base64_decode_url($string) {
return base64_decode(str_replace(['-','_'], ['+','/'], $string));
}

在此使用 random_bytes() 和隨機長度進行檢查

https://3v4l.org/aEs4o
33
biziclop at vipmail dot hu
7 年前
gutzmer at usa dot net 的( https://php.dev.org.tw/manual/en/function.base64-encode.php#103849 )base64url_decode() 函數不會以 '=' 填充較長的字串。這是修正的版本

<?php
function base64url_encode( $data ){
return
rtrim( strtr( base64_encode( $data ), '+/', '-_'), '=');
}

function
base64url_decode( $data ){
return
base64_decode( strtr( $data, '-_', '+/') . str_repeat('=', 3 - ( 3 + strlen( $data )) % 4 ));
}

// 證明
for( $i = 0, $s = ''; $i < 24; ++$i, $s .= substr("$i", -1 )){
$base64_encoded = base64_encode( $s );
$base64url_encoded = base64url_encode( $s );
$base64url_decoded = base64url_decode( $base64url_encoded );
$base64_restored = strtr( $base64url_encoded, '-_', '+/')
.
str_repeat('=',
3 - ( 3 + strlen( $base64url_encoded )) % 4
);
echo
"$s<br>$base64url_decoded<br>$base64_encoded<br>$base64_restored<br>$base64url_encoded<br><br>";
}
?>
1
Daniel Klein
2 年前
在「gutzmer at usa dot net」、「biziclop at vipmail dot hu」和「ivanm at duck dot com」上的改進。

<?php
function base64url_encode($data) {
return
rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function
base64url_decode($data) {
return
base64_decode(strtr($data, '-_', '+/'));
}
?>

超過 4 個字元的字串的任何填充都無效。自至少 PHP 5.4(截至我發佈前檢查的範圍)以來,使用 = 填充解碼函數是不必要的,所以我將其刪除。
20
Hayley Watson
11 年前
大型檔案的 Base64 編碼。

Base64 編碼將三個 8 位元符號轉換為四個 6 位元符號。以長度為 3 位元組的倍數讀取輸入檔案,會產生一個可以獨立於輸入檔案其餘部分進行編碼的區塊。MIME 還強制執行 76 個字元的行長加上 CRLF。76 個字元足以容納 19 個 6 位元符號的四個元組,因此代表 19 個 8 位元符號的三個元組。讀取 57 個 8 位元符號會為完整的 MIME 格式化行提供足夠的資料。最後,PHP 的預設緩衝區大小為 8192 個位元組,足以容納 143 個 MIME 行的輸入。

因此,如果您從輸入檔案中以 8151 (=57*143) 位元組的區塊讀取,您將會得到(最多)8151 個八位元的符號,這些符號會編碼成剛好 10868 個六位元的符號,然後再包裝成剛好 143 行 MIME 格式的行。沒有必要將一個區塊的剩餘符號(無論是六位元或八位元)保留到下一個區塊。只需讀取一個區塊、編碼它、寫出它,然後繼續處理下一個區塊。顯然,最後一個區塊可能會比較短,但它的編碼仍然獨立於其他區塊。

<?php

while(!feof($input_file))
{
$plain = fread($input_file, 57 * 143);
$encoded = base64_encode($plain);
$encoded = chunk_split($encoded, 76, "\r\n");
fwrite($output_file, $encoded);
}

?>

相反地,每行 76 個字元的 MIME 格式行(不包括結尾的 CRLF)正好包含 57 個位元組的輸出資料,而無需保留需要附加到下一行的剩餘位元。這表示每一行都可以獨立於其他行進行解碼,然後可以將解碼後的區塊串連在一起或依序寫出。然而,這確實假設編碼後的資料確實是 MIME 格式;如果沒有這個保證,就必須接受 base64 資料不會如此方便地排列。
16
MitMacher
15 年前
不幸的是,我 2007 年用於即時編碼 base64 的「函式」[已從手冊中移除,取而代之的是這篇文章] 有 2 個錯誤!
第一個錯誤因為缺少「$feof」檢查而導致無限迴圈,第二個錯誤則在較大的檔案中,因為某些原因編碼失敗時,導致了罕見的錯誤,尤其是在
例如設定 fgets($fh, 2) 時。但低於 1024 的值總體來說是不好的,因為它們會減慢整個過程,所以我猜 4096 對於所有目的來說都會很好。
這個錯誤是由於使用「empty()」造成的。

這是修正後的版本,我已經針對各種檔案和長度(最多 4.5 Gb!)進行了測試,沒有任何錯誤

<?php
$fh
= fopen('Input-File', 'rb');
//$fh2 = fopen('Output-File', 'wb');

$cache = '';
$eof = false;

while (
1) {

if (!
$eof) {
if (!
feof($fh)) {
$row = fgets($fh, 4096);
} else {
$row = '';
$eof = true;
}
}

if (
$cache !== '')
$row = $cache.$row;
elseif (
$eof)
break;

$b64 = base64_encode($row);
$put = '';

if (
strlen($b64) < 76) {
if (
$eof) {
$put = $b64."\n";
$cache = '';
} else {
$cache = $row;
}

} elseif (
strlen($b64) > 76) {
do {
$put .= substr($b64, 0, 76)."\n";
$b64 = substr($b64, 76);
} while (
strlen($b64) > 76);

$cache = base64_decode($b64);

} else {
if (!
$eof && $b64{75} == '=') {
$cache = $row;
} else {
$put = $b64."\n";
$cache = '';
}
}

if (
$put !== '') {
echo
$put;
//fputs($fh2, $put);
//fputs($fh2, base64_decode($put)); // for comparing
}
}

//fclose($fh2);
fclose($fh);
?>
19
luke at lukeoliff.com
13 年前
我正在使用一個函式來將本機圖像以 base64 加密程式碼回傳,也就是將圖像來源嵌入 HTML 請求中。

這將大幅減少您的頁面載入時間,因為瀏覽器只需針對整個頁面傳送一個伺服器請求,而不是針對 HTML 和圖像傳送多個請求。請求需要上傳,而世界上 99% 的人都受到上傳到伺服器的速度限制。

<?php
function base64_encode_image ($filename=string,$filetype=string) {
if (
$filename) {
$imgbinary = fread(fopen($filename, "r"), filesize($filename));
return
'data:image/' . $filetype . ';base64,' . base64_encode($imgbinary);
}
}
?>

使用方式如下

<style type="text/css">
.logo {
background: url("<?php echo base64_encode_image ('img/logo.png','png'); ?>") no-repeat right 5px;
}
</style>



<img src="<?php echo base64_encode_image ('img/logo.png','png'); ?>"/>
2
ivanm at duck dot com
2 年前
稍微改進了 gutzmer at usa dot net (https://php.dev.org.tw/manual/en/function.base64-encode.php#103849) 和 biziclop at vipmail dot hu (https://php.dev.org.tw/manual/en/function.base64-encode.php#121767) 的填充問題

<?php
function base64url_encode($data) {
return
rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function
base64url_decode($data) {
return
base64_decode(str_pad(strtr($data, '-_', '+/'), 4 - ((strlen($data) % 4) ?: 4), '=', STR_PAD_RIGHT));
}
?>
5
massimo dot scamarcia at gmail dot com
18 年前
function urlsafe_b64encode($string) {
$data = base64_encode($string);
$data = str_replace(array('+','/','='),array('-','_',''),$data);
return $data;
}

function urlsafe_b64decode($string) {
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return base64_decode($data);
}

PHP 版本的 Perl MIME::Base64::URLSafe,它提供了 URL 安全的 base64 字串編碼/解碼(與 Python base64 的 urlsafe 方法相容)
1
dawgeatschikin at hotmail dot com
18 年前
只是對 massimo 函式的一個小調整。

<?
$data = str_replace(array('+','/','='),array('-','_','.'),$data);
//將 '=' 取代為 '.' 而不是空字串,這樣處理是可逆的。根據 http://www.w3.org/Addressing/URL/5_URI_BNF.html,'.' 對 URI 是安全的。
?>
1
Gabriel Malca
18 年前
如果函式不存在,這是一個有點混亂但有效的方法

<?

echo bencode("Gabriel Malca");
// R2FicmllbCBNYWxjYQ==

function bencode($string='') {
$binval = convert_binary_str($string);
$final = "";
$start = 0;
while ($start < strlen($binval)) {
if (strlen(substr($binval,$start)) < 6)
$binval .= str_repeat("0",6-strlen(substr($binval,$start)));
$tmp = bindec(substr($binval,$start,6));
if ($tmp < 26)
$final .= chr($tmp+65);
elseif ($tmp > 25 && $tmp < 52)
$final .= chr($tmp+71);
elseif ($tmp == 62)
$final .= "+";
elseif ($tmp == 63)
$final .= "/";
elseif (!$tmp)
$final .= "A";
else
$final .= chr($tmp-4);
$start += 6;
}
if (strlen($final)%4>0)
$final .= str_repeat("=",4-strlen($final)%4);
return $final;
}

function convert_binary_str($string) {
if (strlen($string)<=0) return;
$tmp = decbin(ord($string[0]));
$tmp = str_repeat("0",8-strlen($tmp)).$tmp;
return $tmp.convert_binary_str(substr($string,1));
}

?>
0
jonb at wobblymusic dot com
15 年前
請注意,某些應用程式,例如 OpenSSL 的 enc 命令,要求每 64 個字元必須有一個換行符號,它們的 base64 解碼函式才能正常運作。以下函式將會處理這個問題

<?php
function ($encodeMe) {
$data = base64_encode($encodeMe);
$datalb = "";
while (
strlen($data) > 64) {
$datalb .= substr($data, 0, 64) . "\n";
$data = substr($data,64);
}
$datalb .= $data;
return
$datalb;
}
?>
-1
Naser Mirzaei
10 年前
<?php
$image
= 'example.png';

// 讀取圖片路徑,轉換為 base64 編碼
$imageData = base64_encode(file_get_contents($image));

// 格式化圖片 SRC: data:{mime};base64,{data};
$src = 'data: '.mime_content_type($image).';base64,'.$imageData;

// 輸出一個範例圖片
echo "<img src=\"$src\" alt=\"\" />";
?>
0
massimo dot scamarcia at gmail dot com
18 年前
$data = str_replace(array('+','/','='),array('-','_',),$data); // MIME::Base64::URLSafe 實作

$data = str_replace(array('+','/'),array('-','_'),$data); // 如果你在解碼時移除 "=" 字元,Python 會拋出 "TypeError: Incorrect padding" 錯誤
0
juha at kuhazor dot idlegames dot com
20 年前
如果你使用 base64 編碼字串作為 cookie 名稱,請確保你移除了 '=' 字元。至少 Internet Explorer 會拒絕包含 '=' 字元的 cookie 名稱,或包含 %xx 字元取代的 url 編碼 cookie 名稱。使用以下函式將 base64 編碼字串轉換為純字母(同時去除 / 和 + 字元)

<?php
function base64clean($base64string)
{
$base64string = str_replace(array('=','+','/'),'',$base64string);

return
$base64string;
}
?>
-1
Gerard
11 年前
為了使 base64_encode 編碼出與 .net HttpServerUtility.UrlTokenEncode 函式相容的 URL 安全字串,請使用以下程式碼

<?php
url_safe_base64_encode
($string)
{
#首先進行 base64 編碼
$data = base64_encode($string);

#Base64 字串可能以數個 = 字元結尾。這些需要轉換為數字
$no_of_eq = substr_count($data, "=");
$data = str_replace("=", "", $data);
$data = $data.$no_of_eq;

#然後取代所有非 URL 安全字元
$data = str_replace(array('+','/'),array('-','_'),$data);
return
$data;
}
?>
-1
Andi
16 年前
當資料庫中的自動遞增主鍵在 URI 或 API 呼叫中對使用者可見時,我需要一種簡單的方法來模糊處理它們。使用者不應該能夠在 URL 中遞增 ID,並查看資料庫表格中的下一個資料記錄。

我的解決方案(使用 Tom 修改過的 base64 函式)

function base64url_encode($plainText) {

$base64 = base64_encode($plainText);
$base64url = strtr($base64, '+/=', '-_,');
return $base64url;
}

function base64url_decode($plainText) {

$base64url = strtr($plainText, '-_,', '+/=');
$base64 = base64_decode($base64url);
return $base64;
}

function encryptId($int, $class='') {

return base64url_encode($int.'-'.substr(sha1($class.$int.encryptionKey), 0, 6));
}

function decryptId($string, $class='') {

$parts = explode('-', base64url_decode($string));
if (count($parts) != 2) {

return 0;
}

$int = $parts[0];
return substr(sha1($class.$int.encryptionKey), 0, 6) === $parts[1]
? (int)$int
: 0;
}

- 可選的第二個參數是類別名稱,因此不同表格的兩個相同 ID 不會產生兩個相同的模糊 ID。

- encryptionKey 是用於加密的全域金鑰。

- decryptId() 檢查 base64 編碼字串的第二部分是否正確。
-1
Tom
17 年前
此函式支援 RFC 4648 第 5 節中描述的 "base64url",「使用 URL 和檔名安全字母的 Base 64 編碼」

<?php
function base64url_encode($plainText)
{
$base64 = base64_encode($plainText);
$base64url = strtr($base64, '+/', '-_');
return (
$base64url);
}
?>

你可能希望對尾隨的 '=' 字元使用 rtrim(或跳脫字元),以便在 URI 中使用。
-1
guy at bhaktiandvedanta dot com
22 年前
你可以使用 base64_encode 將圖像檔轉換為字串文字,然後顯示它們。我使用這個方法將我的圖像儲存在資料庫中,並從那裡顯示它們。首先,我使用 fread 開啟檔案,對結果進行編碼,然後將該結果儲存在資料庫中。這對於建立隨機圖像很有用。

image.php

<?

header(" Content-Type: image/jpeg");
header(" Content-Disposition: inline");
$sql = "SELECT data FROM image where name='".$img."'";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
$image = $row[0];
echo base64_decode($image);

?>

在 html 檔案中,你放入

<img src="image.php?img=test3" border="0" alt="">

Guy Laor
-3
andronick(dot)mail(dog)gmail(dot)com
14 年前
將圖片輸出到 html

<?php

$imgfile
= "test.gif";

$handle = fopen($filename, "r");

$imgbinary = fread(fopen($imgfile, "r"), filesize($imgfile));

echo
'<img src="data:image/gif;base64,' . base64_encode($imgbinary) . '" />';

?>

gif - data:image/gif;base64,...
jpg - data:image/jpeg;base64,...
png - data:image/png;base64,...
等等。
-1
php at ianco dot co dot uk
18 年前
我發現在 PHP 4.3.9 中,base64_encode(或可能是 echo)存在長度限制。
這個對我來說運作正常
<?php
echo strlen(str_repeat('-', 3273)); // 3273
echo strlen(base64_encode(str_repeat('-', 3273))); // 4364
echo base64_encode(str_repeat('-', 3273)); // LS0t repeated
?>
但是如果將長度改為 3274,第三個 echo 就不會印出任何東西。
<?php
echo strlen(str_repeat('-', 3274)); // 3274
echo strlen(base64_encode(str_repeat('-', 3274))); // 4368
echo base64_encode(str_repeat('-', 3274)); // 完全沒有印出任何東西
?>
如果你想編碼一個相當大的序列化陣列並將其輸出到表單欄位,這會產生明顯的影響。
-1
divinity76 at gmail dot com
3 年前
如果因為某些原因你需要一個 base10 / 純數字編碼,編碼成 0123456789 的某種組合

<?php
// 使用字典 0123456789 進行 base10 編碼
function base10_encode(string $str): string
{
$ret = "";
for (
$i = 0, $imax = strlen($str); $i < $imax; ++ $i) {
$ret .= str_pad((string) ord($str[$i]), 3, "0", STR_PAD_LEFT);
}
return
$ret;
}
// 使用字典 0123456789 進行 base10 解碼
function base10_decode(string $str): string
{
$ret = "";
for (
$i = 0, $imax = strlen($str); $i < $imax; $i += 3) {
// 特別注意這裡我們使用 (int) 來去除零..
$ret .= chr((int) substr($str, $i, 3));
}
return
$ret;
}
?>

它是 Unicode 安全且二進位安全的,測試如下

<?php
// 簡單的 ASCII 測試:
$d=[];
$d["raw"]="test";
$d["b10"]=base10_encode($d["raw"]); // 116101115116
$d["decoded"]=base10_decode($d["b10"]); // test
$d["corrupted"]=$d["raw"]!==$d["decoded"]; // false
var_dump($d);
// 複雜的 Unicode 測試:
$d=[];
$d["raw"]="ˈmaʳkʊs kuːn ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (A ⇔ B), Σὲ γνωρίζω ἀπὸ τὴν κόψη Οὐχὶ ταὐτὰ παρίσταταί გთხოვთ ሰማይ አይታረስ ንጉሥ አይከሰስ ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ ";
// 讓我們加入一些國際象棋作為額外測試
$d["raw"].="♔♕♖♗♘♙♚♛♜♝♞🙾🙿";
$d["b10"]=base10_encode($d["raw"]); //
$d["decoded"]=base10_decode($d["b10"]);
$d["corrupted"]=$d["raw"]!==$d["decoded"]; // false,base10 是 Unicode 安全的 :D
var_dump($d);
// 二進位安全測試:
$everything="";
for(
$i=0;$i<=0xFF;++$i){
$everything.=chr($i);
}
$d=[];
$d["raw"]=$everything;
$d["b10"]=base10_encode($d["raw"]);
$d["decoded"]=base10_decode($d["b10"]);
$d["corrupted"]=$d["raw"]!==$d["decoded"]; // false :D base10 是二進位安全的。
var_dump($d);

?>
-4
markrose at markrose dot ca
13 年前
一種更快速的方法是使用 chunk_split 函數每 64 個字元斷行

<?php
$string
= chunk_split(base64_encode($string), 64, "\n");
?>
-3
Cristiano Calligaro
19 年前
我曾經在 MySQL (使用 BLOB 欄位) 和 MSSQL (使用 TEXT 欄位) 中使用 base64_encode 和 base64_decode 來附加檔案。對於 MSSQL,請記得在 PHP.INI 檔案中將 mssql.textsize 和 mssql.textlimit 都設定為 2147483647。

以下是程式碼

######### MSSQL(mssql_)/MySQL(mysql_) 檔案附加
$val=$HTTP_POST_FILES['lob_upload']['tmp_name'];
$valn=$HTTP_POST_FILES['lob_upload']['name'];
$valt=$HTTP_POST_FILES['lob_upload']['type'];

$data=base64_encode(addslashes(fread(fopen($val, "r"), filesize($val))));

mssql_connect("srv","usr","pass") or die ("");
mssql_select_db("db") or die ("");
$query = "UPDATE $table SET $field='$data', $fieldname='$valn', $fieldtype='$valt' WHERE DocID='$DocID'";
$result = mssql_query($query) or die(mssql_error());
mssql_close();

######### MSSQL(mssql_)/MySQL(mysql_) 開啟附加檔案
mssql_connect("srv","usr","pass") or die ("");
mssql_select_db("db") or die ("");
$query = "SELECT $field,$fieldtype FROM $table WHERE DocID='$DocID'";
$result = mssql_query($query) or die(mssql_error());
$row = mssql_fetch_array($result);

header("Content-type: $row[1]");
echo stripslashes(base64_decode($row[0]));

這個策略對於 Microsoft Word、Acrobat PDF、JPG 圖像等等(甚至是壓縮檔案!!!)都很有用。
-2
ozziez_box at hotmail dot com
6 年前
關於 base64url,你可以直接使用

<?php
$encodedUrl
= urlencode(base64_encode($string));
$decodedUrl = base64_decode(urldecode($string));
?>
-2
eric [at] d512 [dot] com
18 年前
請注意,至少某些 Windows 系統不會印出超過特定長度的字元行,除非它有某種形式的換行。因此,如果你對一個檔案進行 base-64 編碼,為了除錯目的將其印出,卻看不到任何東西,請不要驚慌。
-3
alf at trance dot net
8 年前
@gutzmer at usa dot net

好主意!但是...

函數 base64url_decode 不會對長度超過 4 個字元的字串進行填充。
只有當第二個參數大於原始字串的長度時,str_pad 才會填充字串。所以正確的函數應該是

<?php
function base64url_decode($data) {
$len = strlen($data);
return
base64_decode(str_pad(strtr($data, '-_', '+/'), $len + $len % 4, '=', STR_PAD_RIGHT));
}

請注意,即使沒有補齊字元,base64_decode 也能正常運作這就是為什麼你的函式可以運作的原因
-5
gglockner AT NOSPAMdwaffler DOT com
16 年前
我的範例省略了 strtr 函數。以下是更正後的函數:

<?php
function encode($x) {
return
strtr(base64_encode(substr($_SESSION['Cksum'],rand(0,28),4) . $x), '+/=', '-_~');
}

function
decode($x) {
$y = base64_decode(strtr($x, '-_~', '+/='));
if (
strpos($_SESSION['Cksum'],substr($y,0,4)) === false) return false;
return
substr($y,4-strlen($y));
}
?>
-4
virtuall at virtuall dot info
18 年前
如果你要編碼的文字包含 < 和 > 等符號,並想將其透過 GET 查詢發送,請務必對 base64_encode 的結果進行 urlencode,因為它有時會在結尾加上 + (這是一個特殊符號)。

<?php
echo base64_encode('<html>');
?>

會回傳

PGh0bWw+

像這樣的函數也可能很有用:

<?php
function base64_urlencode($str) {
return
urlencode(base64_encode($str));
};
?>
-4
dlyaza aT yahoo DOT com
18 年前
使用函數
HTML 輸出的內容:
<img src="$self?image=file" border="0" alt="file">
<img src="$self?image=folder" border="0" alt="folder">

function getimage ($image) {
switch ($image) {
case 'file'
return base64_decode('R0lGODlhEQANAJEDAJmZmf///wAAAP///yH5BAHoAwMALAAAA
AARAA0AAAItnIGJxg0B42rsiSvCA/REmXQWhmnih3LUSGaqg35vF
bSXucbSabunjnMohq8CADsA');
case 'folder'
return base64_decode('R0lGODlhEQANAJEDAJmZmf///8zMzP///yH5BAHoAwMALAAAAA
ARAA0AAAIqnI+ZwKwbYgTPtIudlbwLOgCBQJYmCYrn+m3smY5v
Gc+0a7dhjh7ZbygAADsA');
case 'hidden_file'
return base64_decode('R0lGODlhEQANAJEDAMwAAP///5mZmf///yH5BAHoAwMALAAAA
AARAA0AAAItnIGJxg0B42rsiSvCA/REmXQWhmnih3LUSGaqg35vF
bSXucbSabunjnMohq8CADsA');
case 'link'
return base64_decode('R0lGODlhEQANAKIEAJmZmf///wAAAMwAAP///wAAAAAAAAAAA
CH5BAHoAwQALAAAAAARAA0AAAM5SArcrDCCQOuLcIotwgTYUll
NOA0DxXkmhY4shM5zsMUKTY8gNgUvW6cnAaZgxMyIM2zBLCaHlJgAADsA');
case 'smiley'
return base64_decode('R0lGODlhEQANAJECAAAAAP//AP///wAAACH5BAHoAwIALAAAA
AARAA0AAAIslI+pAu2wDAiz0jWD3hqmBzZf1VCleJQch0rkdnppB3
dKZuIygrMRE/oJDwUAOwA=');
case 'arrow'
return base64_decode('R0lGODlhEQANAIABAAAAAP///yH5BAEKAAEALAAAAAARAA0AA
AIdjA9wy6gNQ4pwUmav0yvn+hhJiI3mCJ6otrIkxxQAOw==');
}
}
-3
Anonymous
9 年前
維基百科列出了 Base64 最後兩個字元的 8 種左右的變體 (https://en.wikipedia.org/wiki/Base64)。以下函數可以處理所有這些變體:

<?php
function base64_encode2($data, $a = "+/=") {
$l = strlen($a);
if (
$l === 3) {
return
strtr(base64_encode($data), "+/=", $a);
} else if (
$l === 2) {
return
rtrim(strtr(base64_encode($data), "+/", $a), '=');
} else {
throw new
InvalidArgumentException("Argument #2 must be 2 or 3 bytes.");
}
}

function
base64_decode2($data, $strict = false, $a = "+/=") {
$l = strlen($a);
if (
$l === 3) {
return
base64_decode(strtr($data, $a, "+/="), $strict);
} else if (
$l === 2) {
return
base64_decode(strtr($data, $a, "+/"), $strict);
} else {
throw new
InvalidArgumentException("Argument #2 must be 2 or 3 bytes.");
}
}
?>

使用範例

<?php
$decoded
= "ABC123";

// base64 XML 識別符:
$encoded = base64_encode2($decoded, "_:");
$decoded = base64_decode2($encoded, false, "_:");

// base64 URL (RFC 6920):
// base64 XML 名稱符記:
$encoded = base64_encode($decoded, "-_")
$decoded = base64_decode($encoded, false, "-_");

// 修改後的 base64 XML 名稱符記:
$encoded = base64_encode2($decoded, ".-");
$decoded = base64_decode2($encoded, false, ".-");

// 修改後的用於正規表示式的 base64:
$encoded = base64_encode2($decoded, "!-");
$decoded = base64_decode2($encoded, false, "!-");

// YUI 程式庫中使用的 base64:
$encoded = base64_encode2($decoded, "._-");
$decoded = base64_decode2($encoded, false, "._-");
?>
-4
raat1979 at gmail dot com
6 年前
最短的 base64url_decode (正確版本)

<?php
function base64_urldecode($data){
return
base64_decode(strtr($data,'-_','+/').str_repeat("=", -strlen($data) & 3));
}
?>
To Top