Gzcompress 線上壓縮的做法是:將可讀的 UTF-8 文字,透過與 gzip 相同的 DEFLATE 演算法進行處理,產生一串精簡的二進位資料流,讓它可以嵌入任何接受文字的地方。在瀏覽器中執行此作業的標準方式是:先壓縮輸入資料,再把產生的 RFC 1952 gzip 位元組以標準化並加上填補的 Base64 包裝起來,然後由接收端把 Base64 解碼回位元組,再進行解壓縮。Gzip 壓縮與解壓縮工具完全依照這條流程運作:它會把你的文字轉成嚴格的 UTF-8,進行 DEFLATE 壓縮,加上 gzip 的標頭與結尾,把位元組編碼為 Base64;在反向作業時,則會驗證 Base64、剝除外層包裝,並把資料流還原成 UTF-8 文字,且不會出現靜默替換字元的情形。

大多數讀者都是因為有 PHP 背景才會進入這個頁面。在 PHP 中,內建的 gzcompress 函式會回傳原始的 DEFLATE 資料——沒有 gzip 標頭,也沒有檢查碼外層封裝。這個差異很重要,因為許多程式語言與函式庫預期接收的是完整的 RFC 1952 格式,包含魔術數字 1f 8b、方法位元組 08、時間戳記,以及 CRC32 結尾。當你想把壓縮後的輸出分享給 Python 的 gzip 模組、Node 的 zlib.gunzip、Go 的 compress/gzip 讀取器,或是瀏覽器端的 DecompressionStream 時,通常需要的是完整的 gzip 容器,而不是 PHP 的 gzcompress 所產生的純 DEFLATE 區塊。這也是為什麼以 RFC 1952 為目標、以瀏覽器為基礎的工具,是進行 gzcompress 線上作業時最普遍相容的選擇。

gzcompress online
gzcompress online

Gzcompress 線上壓縮實際上會產生什麼

當你要求工具執行 gzcompress 線上壓縮時,會依序發生三件事。首先,輸入字串會被編碼為 UTF-8,讓表情符號與帶有腔調的字元能夠正確地往返轉換。其次,這些位元組會通過 DEFLATE 壓縮器,而工具會依 RFC 1952 的規定,在前後分別加上十位元組的 gzip 標頭與八位元組的結尾。最後,產生的位元組序列會以標準化並加上填補的 Base64 呈現,讓整個壓縮後的資料可以貼進 JSON、資料庫欄位、HTTP 標頭或設定檔中,完全不必擔心跳脫字元的問題。

在還原的方向上,解碼器會反過來執行這條管線:解析 Base64、檢查 gzip 的魔術位元組、根據未壓縮資料驗證 CRC32 與長度結尾、解壓縮 DEFLATE 資料,最後嚴格地把結果位元組解讀為 UTF-8。任何無效的序列都會產生明確的錯誤,而不是某些函式庫會靜默套用的問號替代字元。

為什麼瀏覽器工具是合適的選擇

純 JavaScript 的實作方式在這項任務上有實際的優勢。完全不需要上傳到伺服器,這在處理的文字包含日誌、設定片段,或你不希望離開工作站的範例資料時尤其重要。壓縮作業與網頁在同一執行緒上執行,因此沒有排隊、沒有限流,而且輸出結果是可重現的——每次以相同的輸入執行都會產生相同的 Base64 字串,這對於跨機器比較結果,或在測試固定資料中鎖定輸出時非常有幫助。

容器魔術位元組常見的使用端
原始 DEFLATE(PHP gzcompress)無——第一個位元組不固定PHP gzuncompress、部分 C 語言的 zlib 呼叫
Zlib 外層封裝(PHP gzencode -k)78 01 / 78 9C / 78 DA部分 HTTP 壓縮路徑
Gzip(RFC 1952)1F 8BPython gzip、Node zlib.gunzip、Go compress/gzip、瀏覽器
Base64 包裝的 gzipH4sI…JSON 欄位、資料庫、複製貼上傳輸

這個表格說明了為什麼選擇正確的容器就已經完成了一半的工作。預期接收 gzip 格式的接收端會拒絕原始的 DEFLATE 區塊;而預期接收原始 DEFLATE 的系統也會拒絕被外層包裝過的資料流,即使兩者是由同一個演算法所產生。

在瀏覽器中壓縮與解碼文字

  1. 開啟Gzip 壓縮與解壓縮工具,選擇 UTF-8 轉 gzip Base64 的方向。
  2. 貼上或輸入你想縮小的文字。請保持在頁面上標示的大小範圍內;在行動裝置上,過大的貼上內容可能會超出可用的記憶體。
  3. 點擊壓縮,並等待 Base64 輸出產生。結果的開頭必定會是 H4sI,因為這正是 gzip 魔術位元組 1F 8B 08 的 Base64 編碼結果。
  4. 複製完整的、帶有填補的 Base64,包括結尾的 = 號(如果有的話)。即使只截斷一個字元,也會讓另一端的解碼作業失敗。
  5. 若要反過來執行,請把工具切換到 gzip Base64 轉 UTF-8 的方向,然後貼上標準化的 Base64 字串。
  6. 點擊解壓縮,並確認還原後的內容與原始文字逐字元相符,包括所有帶腔調的字母或表情符號。

如果步驟 6 產生錯誤而非文字,最常見的原因是缺少或多了一個 = 填補符號、複製貼上過程中加入了內部空白,或資料被進行了兩次 Base64 編碼。在假設壓縮資料已損毀之前,請先重新檢查來源字串。

Gzcompress 線上壓縮的常見情境

開發者會在幾個反覆出現的情境中使用 gzcompress 線上壓縮。一種情況是:先把大型 JSON 酬載縮小,再存入沒有原生壓縮功能的文字欄位;此時 Base64 外層封裝可以在不受 VARCHAR 長度限制的情況下正常運作,也完全不需要處理跳脫字元。另一種情況是:在 Pull Request 中分享固定測試資料——一個 200 KB 的 JSON 檔案經過 gzip 處理後通常會縮到 30 KB 以下,產生的 Base64 結果在程式碼審查中也能輕鬆容納。第三種情況是:為已經原生支援 gzip 的系統準備資料,例如帶有 Content-Encoding: gzip 的 HTTP 請求主體,你會希望在送出之前先確認酬載能正確解壓縮成預期的文字。

另一個情境是:從 PHP 的 gzcompress 輸出進行轉移,因為接收端的服務預期的是完整的 RFC 1952 資料流。如果你手上有一個由 PHP 產生的 Base64 編碼區塊,而下游系統一直拒絕接收,常見的解決方式是改用正確的 gzip 外層封裝重新編碼,而不是使用原始的 DEFLATE 區塊。當情況需要時,你也可以使用本站的其他公用程式——例如,Base64 解碼教學更深入地說明了標準化的編碼規則,而Base64 編碼與解碼工具則適用於輸入根本不是 gzip、只是一般需要 Base64 包裝的純 UTF-8 文字的情況。

什麼時候不適合使用 Gzcompress 線上壓縮

壓縮只有在輸入具有冗餘性時才會有效果。已經被壓縮過的檔案——JPEG 影像、MP4 影片、ZIP 封存、加密後的密文——經過 gzip 後通常會變大幾個位元組,這是因為 DEFLATE 演算法找不到重複的樣式,卻仍然必須加上標頭與結尾。如果你需要嵌入二進位檔案,請使用專為此用途設計的工具,而不是 UTF-8 gzip 管線;關於更合適的做法,請參考檔案轉 Base64 轉換器。

在決定採用哪種格式之前,也值得先確認接收端的預期規格。有些 API 預期接收的是沒有任何編碼的原始 gzip 位元組,這種情況下必須在用戶端剝除 Base64 外層封裝。其他則預期接收 zlib 資料流,它使用的是 78 xx 標頭,而不是 1F 8B。送錯容器是「gzcompress 線上」整合在首次嘗試就失敗的最常見原因之一,所以在把輸出貼進正式環境之前,請先確認規格。

驗證輸出結果

壓縮之後一個簡單的健全性檢查,就是查看 Base64 開頭的前幾個字元。使用預設 DEFLATE 壓縮方法的 RFC 1952 gzip 資料流,在包裝為 Base64 之後,開頭必定是 H4sI,因為這正是位元組 1F 8B 08 的固定編碼結果。如果你的輸出開頭是別的字串,工具可能寫出的是原始 DEFLATE、zlib 資料流,或完全是其他東西。解碼之後,再用同一個工具重新編碼結果,應該會得到一模一樣的 Base64 字串——這個特性可以作為 CI 管線或迴歸測試指令碼中的往返測試。

如果要長期儲存,請保留帶有完整填補的 Base64,並避免換行——除非接收系統明確要求這樣做。大多數 gzip 解碼器都能處理換行的 Base64,但結尾少一個 = 號就足以讓解壓縮作業因為長度檢查錯誤而失敗。如果你需要透過一個會不可預期地移除空白的管道來傳輸位元組,較安全的做法是先將字串壓平,然後在另一端使用專門的Base64 工具重新加上填補。

整合以上所有步驟

正確地完成 gzcompress 線上壓縮,其實是一個三步驟的循環:選擇正確的容器、把結果包裝起來以承受複製貼上,以及在依賴它之前驗證往返結果。Gzip 壓縮與解壓縮工具把這個循環縮得很短——貼上文字、複製 Base64、送出——整條管線都在本機執行,因此不會有任何資料外洩。當你需要處理二進位酬載、解碼外部資料,或健全性檢查其他語言的輸出時,可以再搭配本站的 Base64 與檔案編碼公用程式;如此一來,你就擁有了一套完整的工作流程,可以在不安裝任何函式庫的情況下,產出並取用 gzip 文字。

延伸閱讀:將十六進位檔案無誤地轉換為可讀文字。

延伸閱讀:Base100 編碼器:線上將文字轉為表情符號。