一個完整的 SVG 文件經 Base64 編碼後會變成一個文字權杖,形式為 data:image/svg+xml;base64,…,其中逗號後面的位元組是以 RFC 4648 Base64 字元表示的 SVG 來源。四個 Base64 字元通常代表三個來源位元組,所以編碼後的輸出大約比原始 SVG 大三分之一(尚未加上資料 URL 前綴),而根據 RFC 4648 的定義,Base64 是一種二進位對文字的表示法,而非壓縮格式。SVG 內部的 Unicode 字元——包括屬性值、文位元組點、註解和中繼資料——必須在 Base64 編碼之前先轉成位元組,標準契約要求該轉換使用 UTF-8 而非 Latin-1,這樣帶重音符號的字母、CJK 表意文字和表情符號才能正確往返轉換。SVG to Base64 Converter 使用瀏覽器的 TextEncoder 執行這個 Unicode 對 UTF-8 的步驟,以有界區塊處理位元組串流,套用 Base64,然後在前面加上解碼器所期望的精確前綴 data:image/svg+xml;base64,。這些步驟都不會渲染或執行 SVG、不會清理主動內容,也不會離開目前的瀏覽器分頁,這使得轉換結果在測試上可預期,在執行於您已掌控的專有圖示時也很安全。

「將 SVG 編碼為 Base64」實際上產生什麼
這個詞涵蓋一個特定的轉換:一個完整的 SVG 文字文件會變成可複製貼上的資料 URL,讓您能放入 CSS 的 background-image 屬性、<img src="…"> 屬性,或 HTML 的內嵌 SVG 內容中。輸出是純文字而非影像檔,並且在某種意義上是自給自足的:消費者不需要額外的網路請求來取得圖檔。正是這種自給自足的特性讓開發者選擇它:它消除了 HTTP 來回行程,讓樣式表能以單一檔案發布,並避免從檔案系統開啟頁面時出現破圖。權衡之處在於,編碼後的承載會隨著每個包含它的頁面或樣式表一起傳遞,瀏覽器無法獨立快取該 SVG,而且位元組也比原始標記大。編碼本身也完全與 SVG 繪製的內容無關。無論文件包含的是單一黑色方塊還是讀取 cookie 的 script 標籤,轉換器都會產生同一種資料 URL,而安全責任仍歸屬於決定如何嵌入結果的人。
如何用三個步驟將 SVG 編碼為 Base64
- 開啟 SVG to Base64 Converter,選擇 Encode,然後貼上完整的 SVG 來源。完整的來源具有 <svg> 根元素以及結尾的 </svg> 標籤,前後可選的位元組順序標記與周圍空白會被去除。
- 執行轉換,並在輸出區域檢查完整的文字結果。結果以 data:image/svg+xml;base64,開頭,後接 Base64 字元,且不涉及內嵌指令碼、抓取或渲染。
- 複製結果,並在確切受信任的目的地進行測試。將其貼入 CSS 規則、<img> 標籤或沙箱化的 HTML 預覽中,然後在正式採用前確認目的地的尺寸限制和內容安全政策能接受該承載。
為什麼 Unicode 字元需要先經過 UTF-8 步驟
JavaScript 字串是 UTF-16 程式碼單位的序列,而非位元組;Base64 則是作用在位元組上。直接呼叫 btoa(svgString) 的捷徑只有在字串碰巧包含與 ASCII 程式碼點相同的字元時才能正常運作,這就是為什麼僅含 ASCII 的圖示看似編碼正常,而一個帶重音的字母、中文字或表情符號卻會悄悄毀損輸出。根據 WHATWG Encoding Standard,正確的管道應先將字串轉換成 UTF-8 位元組——一個 ASCII 字元變成一個位元組,一個像 é 這樣的兩位元組序列變成兩個位元組,一個三位元組序列變成三個位元組,一個表情符號變成四個位元組。SVG to Base64 Converter 使用 TextEncoder 進行該轉換,然後以區塊方式對產生的位元組陣列進行 Base64 編碼,以避免編碼呼叫的引數列表過大。在解碼端,格式錯誤的 UTF-8 會引發錯誤,而非以 U+FFFD 替換字元替代,這使得假性成功的往返轉換不可能發生:損壞的文件會大聲失敗,而不是以悄悄替換的字形渲染。
內嵌資料 URL 與獨立 SVG 檔的比較
同一個 SVG 可以作為內嵌資料 URL 或獨立參考的檔案傳遞給瀏覽器,而正確的選擇取決於大小、重複使用性與快取。下表摘要說明已記錄的權衡取捨,並未聲稱有通用的最佳解,因為實際傳遞的數字取決於您頁面的其他部分以及伺服器的內容協商。
| 考量項目 | 內嵌資料 URL | 獨立的 .svg 檔 |
|---|---|---|
| 所需的 HTTP 請求數 | 少一次抓取,因為圖檔隨 HTML 或 CSS 一起傳遞 | 圖檔需要額外一次請求 |
| HTTP 快取 | 與父文件綁定,無法獨立快取 | 在一般快取標頭下,跨頁面與跨造訪重複使用 |
| Base64 膨脹的影響 | 內嵌承載增加約三分之一,加上前綴 | 檔案以 image/svg+xml 提供;HTTP 內容編碼可加以壓縮 |
| 在 DevTools 中除錯 | 編碼後的字串難以即時檢視與編輯 | 來源 SVG 可直接以文字開啟 |
| 最適合的情境 | 小而獨特、僅打包一次的圖示 | 重複使用的素材、大型圖檔、經常更新的圖形 |
對於跨多個頁面共用的標誌或字符集,獨立快取的 SVG 檔案在傳遞位元組數上通常勝出。對於僅出現在單一 CSS 套件中的一次性圖示,內嵌資料 URL 則可簡化部署。請以實際頁面而非單獨的圖示來衡量。
使用解碼器對資料 URL 進行往返驗證
確認編碼器產出正好是您預期位元組的最快方法,是將結果解碼回文字,並與來源進行差異比對。同一個工具僅接受 data:image/svg+xml;base64,前綴作為其唯一識別的輸入,這是刻意限縮的契約:它會拒絕沒有媒體類型的純 Base64、URL 編碼的 SVG、替代的媒體類型參數,以及經空白正規化的承載。此契約使往返轉換保持確定性,因此當解碼器返回原始的 Unicode 文件時,您就能確定編碼器既未遺漏字元也未悄悄替換位元組。一個實用的模式是:先編碼 SVG,將資料 URL 貼入解碼器,把還原的文字複製到像 Diff Checker 這樣的工具中,並確認唯一的差異僅是可選的空白。如果您是為了嵌入 CSS 而編碼 SVG,請先用一個小型範例文件往返一次,讓資料 URL 長度可預期,再將其接入建置步驟或內容安全政策中。
編碼器不會跨越的安全界線
編碼不等於清理。SVG 可能帶有指令碼、onload 等事件處理常式、透過 <foreignObject> 引入的外部內容、連結、外部影像參考、會抓取資源的 CSS 動畫,以及行為取決於嵌入情境的濾鏡基元。轉換器絕不會預覽所提供的 SVG,也絕不會重寫它——這是一條安全界線而非缺陷:在工具內部渲染需要為此目的設計的沙箱,而契約刻意迴避了這種複雜度。語法上通過的字串仍可能是無效的 SVG、在不同瀏覽器中渲染結果不同,或指向無法取得的資源,而命名空間、屬性、參考、尺寸、路徑、樣式與無障礙中繼資料都不會被修復。編碼也不會改變目的端處理該承載的方式。請僅將資料 URL 放入您所掌控的情境中,遵守消費端的內容安全政策,並讓任何不受信任的 SVG 在送交編碼器之前,先經由維護良好的清理流程處理。500,000 字元的來源限制約束了記憶體與主執行緒的工作量,但產生的資料 URL 仍可能超出瀏覽器、資料庫、標頭、QR code 或建置工具的限額,因此請以實際目的端而非僅憑來源長度來檢查這些預算。八組 RFC 4648 與 UTF-8 測試案例鎖定了編碼器在 ASCII 標記、兩、三、四位元組 UTF-8 序列、屬性、換行、巢狀標記與命名空間文字上的輸出,額外的測試則會拒絕格式錯誤的文件、錯誤的前綴和無效的 Base64,這正是為什麼成功的往返轉換是有意義的訊號,而非憑運氣的猜測。