Base64 會把一份完整的 SVG 檔案轉成 data:image/svg+xml;base64 字串,讓這個向量檔能直接內嵌在 HTML、CSS 或 JavaScript 中,不需要額外的 HTTP 請求。這個轉換是 RFC 4648 所定義的一種純文字對文字的處理:來源 SVG 的每三個位元組會變成四個 Base64 字元,所以在加上 data URL 前綴之前,編碼後的輸出大約會比原始檔案大三分之一。Unicode 字元、帶重音的拉丁字母、CJK 字形以及 emoji,都會先編碼成 UTF-8 位元組,再把這些位元組以 Base64 編碼。完整的可逆路徑是:SVG 原始碼 → UTF-8 位元組 → Base64 字元 → data URL。反向操作則是:拿到對應的 data URL,移除前綴,解碼 Base64,並把解出來的位元組驗證為 UTF-8,再回傳 SVG 文字。SVG to Base64 Converter 就是在你的瀏覽器中執行這個轉換,完全不需要上傳、不進行任何算繪,也不會對來源檔案偷偷做消毒處理。

how to convert svg image to base64
how to convert svg image to base64

SVG Data URL 的組成結構

Data URL 是一段單行的文字,包含媒體類型、編碼標籤,以及承載的主體內容。對 SVG 來說,標準化的格式是 data:image/svg+xml;base64,<payload>,其中前綴告訴接收端接下來是什麼樣的位元組,以及這些位元組是如何產生的。承載內容是 SVG 的 UTF-8 位元組序列經 Base64 編碼後的結果,而前綴本身並不屬於編碼後的位元組;解碼器會先把它去掉,再反轉編碼過程。根據 RFC 4648,Base64 是一種「二進位對文字」字母表,而不是壓縮格式,所以承載內容永遠會比原始位元組長度還要大。

這個結構會帶來一些實際上的影響:

  • 往返轉換的兩端必須使用完全相同的前綴。嚴格的解碼器會拒絕缺少、拼錯或使用替代前綴的情況,而不是默默產生錯誤結果。
  • 承載內容是不透明的 ASCII。原始 SVG 標記在 data URL 內不可讀,也無法在程式碼審查中直接做差異比對,必須先解碼才能檢視。
  • Data URL 是一條獨立字串,不會參照任何外部檔案,因此 SVG 所需的一切(字型、圖片、腳本)都必須以內嵌方式提供,或可從嵌入環境本身取得。

如何將 SVG 轉成 Base64

  1. 在瀏覽器中開啟 SVG to Base64 Converter,選擇 編碼 (Encode) 方向。
  2. 把一份完整的 SVG 檔案貼到來源區。這個工具要求必須有完整的 svg 根元素並帶有結尾標籤,在處理時會先去除選擇性的 UTF-8 位元組順序記號 (BOM) 與周圍空白。它不強制要求特定的命名空間宣告,但你所提供的命名空間、屬性與元素內容都會原樣保留。
  3. 執行轉換。工具會先用瀏覽器的 TextEncoder 把 Unicode 文字編碼為 UTF-8 位元組,再以有界區塊處理這些位元組,並把每個區塊依序 Base64 編碼,合併成單一輸出字串。
  4. 檢視完整的文字結果。回傳的字串一開頭會是精確的前綴 data:image/svg+xml;base64,接在後面的是 Base64 承載內容。如果需要確認編碼是否正確,可以比對承載內容的前幾個字元是否與已知的往返測試一致。
  5. 複製完整的 data URL,貼到實際要使用它的目的地:img 的 src、CSS 的 background-image: url(...) 宣告、JavaScript 字串,或建置階段的樣板。
  6. 在真正會消費這段內容的環境中測試算繪結果。開啟頁面或預覽,確認 SVG 正確顯示,並檢查瀏覽器主控台是否有 CSP 或混合內容 (mixed-content) 錯誤。

來源輸入的上限為 500,000 個字元。產生的 data URL 仍可能超出目標網站的政策、HTTP 表頭大小,或目的地所規定的較小容量上限,所以在決定採用內嵌方式之前,務必先規劃好測試步驟。

如何把編碼後的輸出讀回來

當你從建置工具、CMS 匯出檔或樣式表中繼承到一段 data URL,想還原成原始 SVG 以便編輯時,反向操作就很有用。轉換器用相同的三步驟流程處理這個方向,只要改選「解碼 (Decode)」而非「編碼」即可。

方向 輸入 輸出 驗證步驟
編碼 (Encode) 完整的 SVG 檔案 (UTF-8 文字) data:image/svg+xml;base64,... 字串 去除 BOM,驗證 svg 根元素結構
解碼 (Decode) 精確的 data:image/svg+xml;base64,... 字串 UTF-8 SVG 文字 對解碼後的位元組執行嚴格的 UTF-8 驗證

解碼器只接受精確符合的前綴。它不會猜測純 Base64、URL 編碼的 SVG、其他媒體類型參數,或是經過空白正規化的承載內容。嚴格的輸入契約可以避免不小心解碼到無關的資料,並讓不同瀏覽器之間的往返行為保持一致。若輸入不符合,轉換器會回傳錯誤,而不是嘗試修補前綴或用替代字元取代。

為什麼編碼後的輸出會比來源大

Base64 為來源資料的每六個位元配一個 ASCII 字元。三個來源位元組(共 24 個位元)會變成四個 Base64 字元,這就是造成體積成長的規則。以較小的 SVG 來看,計算方式很直接。

一個 300 位元組的 SVG 會產生 300 / 3 * 4 = 400 個 Base64 字元,再加上 26 字元長的前綴 data:image/svg+xml;base64,總計大約 426 個字元。這比來源位元組多了大約 42%,其中尚未計入當輸入長度無法被三整除時,演算法額外加入的 = 填補字元。

這樣的膨脹並不是 bug。Base64 在規範中被定義為一種「二進位對文字」表示法,並非壓縮,而 WHATWG 編碼標準 規範了 Base64 所吃進的 UTF-8 位元組序列。體積成長就是把二進位資料搬進純文字管道的代價。對 SVG 而言有兩個實際的後果:

  • SVG 若以獨立檔案形式提供,可以透過 HTTP 內容編碼(通常是 gzip 或 Brotli)進一步壓縮。同一個 SVG 若以 Base64 data URL 內嵌,通常就無法壓縮,所以實際在線上傳輸的體積,會比 Base64 本身的膨脹還要更大。
  • Data URL 無法獨立於所在文件之外被快取。如果同一個 SVG 出現在多個頁面,每個頁面都會各自帶一份自己的拷貝。

可靠的經驗法則是實際量測夾帶 data URL 後的 HTML、CSS 或 JavaScript 大小,而不是預設內嵌就一定比較快。對較大且可重複使用的資產來說,獨立快取的 SVG 檔案幾乎總是更划算。

Unicode、UTF-8 與特殊字元

SVG 檔案經常包含非 ASCII 字元:text 元素內含重音拉丁字母、CJK 標籤、emoji 或註解。這些字元在 Base64 編碼之前,都必須先編碼成 UTF-8 位元組。一種常見的錯誤做法,是直接把 JavaScript 字串交給只支援 Latin-1 的 Base64 輔助函式,因為每個字元都被當成一個位元組,結果會把編碼點高於 255 的字元悄悄損毀。

本轉換器使用瀏覽器的 TextEncoder 來產生 UTF-8 位元組序列,接著以有界區塊處理位元組以避免參數清單過大,然後才進行 Base64 編碼。在解碼端,位元組序列會經過嚴格的 UTF-8 驗證器。格式錯誤的 UTF-8 會產生明確的錯誤,而不是以取代字元 U+FFFD 帶過,因為那會造成一個看起來正常、實際上並未正確往返的假成功結果。

來源文字 UTF-8 位元組數 Base64 字元數
純 ASCII(例如簡單標記) 每字元 1 位元組 每 3 位元組 4 字元
帶重音的拉丁字母(例如 é) 每字元 2 位元組 每 3 位元組 4 字元
CJK 與大多數 emoji 每字元 3 或 4 位元組 每 3 位元組 4 字元

Base64 本身決定了固定的位元組對字元比例;來源字元的類型只會改變在 Base64 編碼開始之前,來源文字會膨脹成多少位元組。在編碼標準規定了 UTF-8 位元組輸出的前提下,一旦取得位元組數,同樣的三分之一公式依然適用。

Data URL 最適合的使用情境(以及應該跳過的時機)

當向量圖檔很小、用途單一,而且與特定文件綁定時,Base64 SVG data URL 就能發揮作用。常見的適合情境包括:單一頁面或樣板內的內嵌圖示與標誌,在這種情況下,多一次的 HTTP 請求會比體積成長更昂貴;電子郵件樣板,因為許多郵件客戶端會擋掉外部圖片,而 data URL 會跟著郵件一起送達;伺服器端算繪的 HTML,SVG 由使用者控制的資料組成,而 data URL 是注入結果最簡單的方式;以及 CSS 展示與 CodePen 風格的程式碼片段,在這類場景中,來源的可讀性比能直接貼上更重要。

當 SVG 檔案較大、會在多個頁面重複使用,或是屬於某套設計系統的一部分時,就應該跳過內嵌。搭配正確的 HTTP 快取、內容編碼與穩定 URL 的獨立檔案,幾乎總是更省傳輸成本,也更容易除錯。轉換器的 500,000 字元來源上限,同樣意味著你能產生的 data URL 也有天花板;如果交付的內容超過這個上限,採用檔案方式才是正確做法。

安全性:Base64 能做與不能做的事

Base64 是一種呈現格式,而不是安全邊界。把 SVG 編碼並不會消毒它、不會移除腳本,也不會擋掉外部資源。腳本、事件處理器、foreignObject 內容、連結、外部字型參照以及濾鏡基本元素,都會原封不動地留在 data URL 內,一旦結果被嵌入到會執行它們的環境,這些內容就會重新生效。

本轉換器絕不會預覽或執行所提供的 SVG,因此在轉換步驟中移除了意外執行的立即風險,但風險只是轉移到了嵌入端。具體來說:不要把來源不可信的 SVG 輸出放進 iframe、object、DOM 或任何 CSS 屬性,除非該環境配備維護良好的消毒流程,以及針對該情境設計的內容安全政策 (CSP)。請把 data URL 視為與原始 SVG 檔案一樣對待:若你不會把該檔案放在自己的網站上,就不要內嵌它的 data URL。對來源不可信的 SVG 應使用獨立、沙箱化的服務環境,搭配嚴格的 HTTP 表頭與持續維護的消毒器。僅靠編碼並無法提供任何保護。

在實際目的地測試結果

轉換本身是在本地進行的,但真正重要的是目的地實際如何處理這個資料 URL。在發佈之前,請確認三件事。

  1. 目的地的內容安全政策允許該資料 URL。有些網站會在 CSS、行內腳本或圖片情境中完全封鎖 data: scheme 的 URL。img-src 'self' data: 是允許行內 SVG 圖片的常見值。
  2. 未超出目的地的大小預算。標頭、資料庫欄位、QR 碼和模板引擎都有其限制,而來源端的 500,000 字元上限並不會優先於這些限制。
  3. SVG 在嵌入情境中的呈現方式與其作為獨立檔案時相同。經過清理的 Markdown 渲染器、嚴格的 CSS 解析器,或精簡過的郵件客戶端,對腳本、濾鏡或外部參考的反應,可能與完整的瀏覽器不同。

如果呈現出來的結果出現差異,應該檢查的是來源 SVG 本身,而非資料 URL。編碼是確定性的且可逆的;差異來自嵌入情境,而非轉換過程。

延伸閱讀:如何在不打程式碼的情況下用 Java 解析 URL。

延伸閱讀:將 SVG 編碼為 Base64:UTF-8 資料 URL 工作流程。