一個完全在瀏覽器中執行的空白字元移除替代工具,可以用三種明確的模式來清理貼上的文字——收合水平空白、修剪行並移除空白行,或移除所有空白字元——而不是隱藏一個模糊不清的「移除」定義。Whitespace Remover 接受純文字,在目前分頁中本地套用三種轉換其中之一,回報輸入與輸出之間精確的 JavaScript UTF-16 碼元差異,並在文字進入剪貼簿之前先提供清理後的字串供檢視。正是這個三模式合約,讓真正的替代工具與那種默默刪除有意義的段落換行、或在只想修正字詞之間多餘空格時悄悄把資料紀錄融合在一起的單按鈕清理器有所區別。

大多數使用者在現有方法讓他們失望之後,才會搜尋空白字元移除替代工具。Python 的 re.sub 呼叫會把作者原本想保留的段落換行壓平。以上傳為基礎的線上服務會把敏感的草稿文字移到別人的伺服器上。桌面編輯器的尋找及取代對話框,則迫使同一段正則表達式在每次貼上新工作時都得重新輸入一次。Whitespace Remover 把這些變通方法全部收斂成一個可見、可審核的選擇,而且這個選擇就住在文字本身所在的同一個分頁裡。

whitespace remover alternative
Whitespace Remover 替代工具:三種模式,無需上傳

為什麼人們會尋找空白字元移除替代工具

「移除空白字元」這句話聽起來毫不含糊,直到某些重要的東西消失為止。大多數空白字元問題的起點都相同:文字帶著多餘的空格、雜亂的定位字元、重複的空白行,或是在 Unix 環境中出現 Windows 行尾,而修應該是微不足道的。當標準工具對於「移除」該保留什麼各有分歧時,這個修往往一點都不簡單。

使用 re.sub(r'\s+', ' ', text) 的 Python 一行指令會把每一段連續空白縮成單一空格,同時也會把作者原本想保留的段落換行一併壓平。以上傳為基礎的線上服務是在別人的伺服器上處理私人草稿,這對法律文案、醫療紀錄或任何受 NDA 約束的內容來說根本行不通。桌面編輯器的尋找及取代對話框雖然能用一次,但下一段貼上的文字又得重來一次,而且還得再把那同一段正則表達式重新打一次。

一個專門打造的瀏覽器工具,透過把「要動哪一種空白?」這個問題與「按下按鈕」這個動作分開,來解決上述每一個痛點。模式之間的選擇是可見的,輸出可以預覽,而轉換就在目前的瀏覽器分頁中執行,所以文字絕不會離開裝置。清理過程是本地、確定性且可逆的——只要切換模式就能還原——這些是那些替代工具通常缺乏的三項特性。

三種模式,三種不同的工作

模式作用說明最佳用途
收合水平空白每一行中連續的空格、定位字元及其他水平空白會變成一個普通空格;行斷點旁的空格會被刪除;CRLF 行尾會被正規化為 LF;整個結果會在開頭與結尾處進行修剪散文、文章、電子郵件草稿,以及換行帶有語意的段落
修剪行並移除空白行以行尾符號切分文字,修剪每一行的頭尾,刪除所有變成空白的行,再用 LF 行斷點把倖存行重新接起來;非空行內部的空白間距完全不動複製的表格、紀錄輸出、貼上的清單、從 PDF 摘出的筆記
移除所有空白字元刪除所有符合 JavaScript Unicode 感知空白類別的字元——普通空格、定位字元、行斷點、不斷行空格以及其他可辨識的空白壓縮權杖、機器輸入、允許結果黏合在一起的控制識別碼

模式名稱就是契約。收合模式絕不會刪除段落換行。清理行模式絕不會變更非空行的內部內容。全部移除模式絕不會保留任何正則表達式所匹配的內容,這也包含換行,所以它的標籤與輸出預覽在使用者按下複製按鈕之前就已經把這項行為說明白。選錯模式是一個可挽回的錯誤,因為切換模式並按下「清理文字」就會產生新輸出;只要輸入一變動,舊結果就會立刻被清除。

如何使用三種模式清理貼上的文字

  1. 把要清理的純文字貼上或輸入到輸入區中。
  2. 選擇符合你下游格式的模式——散文用收合、清單與紀錄用修剪行、嚴格控制的機器輸入才能用全部移除。
  3. 點選「清理文字」並讀取結果面板,檢視精確的輸出。
  4. 檢查所顯示的計數。工具會顯示移除了多少個 JavaScript 碼元,以及最終輸出長度。
  5. 使用複製控制項複製清理後的字串,或從唯讀的結果面板中手動選取。
  6. 如果下游的使用者抱怨,把原始內容貼回來、切換模式再跑一次。轉換是確定性的,所以同一段輸入配同一個模式永遠會產生相同的字串。

工具會在輸入變動或模式切換的瞬間清除先前的輸出,因此複製的結果絕對不會被誤認為是當前設定所產生。空的清理結果仍然會以零長度的輸出顯示;長度為零是一個合理的答案,不是失敗的指標。

計數代表什麼(以及不代表什麼)

標示為「已移除」與「輸出長度」的數字是 JavaScript UTF-16 碼元,不是位元組、不是可見字元,也不是字素。對於一般的英文 ASCII,三種度量通常相等,因為一個碼元等於一個位元組也等於一個可見字母。一旦文字中出現需要超過一個碼元才能表示的內容——表情符號、許多 CJK 字元、組合附加符號、某些古文字,以及輔助平面中的字元——這些數字就會開始出現落差。

工具本身並不宣稱別的。它回報碼元數,因為這正是瀏覽器內轉換實際移動的量;對於特定的輸入與所選的模式,這個計數是確定性的,這使得「已移除」這項數字適合作為健全性檢查,而不是作為字元感知工具的替代品。如果下游使用者在意的是視覺字元、儲存用的位元組長度,或散文指標用的字數,請把清理過的輸出丟給專門的工具,而不是信任這個面板。

計數也不是行數。清理過後,兩個合理的下一步分別是:當下一個階段在意行數總計時,跑一次行數計算;當使用者想要散文指標時,跑一次字數計算。把 Whitespace Remover 面板當成上述任何一個工具都會誤報,因為該面板刻意回報轉換實際移動的量,而不是去近似某個它無法量測的東西——只要內容含有表情符號或組合附加記號,就會出錯。

當空白是資料而不是裝飾時

有三種情況建議改用其他工具,或直接手動編輯,不依賴任何工具。

源碼以及縮排驅動的語言把空白視為語法。Python、YAML、F# 以及大多數 Makefile 會在定位字元變成空格、內部空格被收合、或行尾變動時發生錯誤或行為改變。收合模式確實會把 CRLF 正規化為 LF,Windows 的簽出工具可以忽略這件事,但 Linux 工具卻不行,所以即使這組中最安全的模式,對那些格式來說也並不安全。對源碼來說最接近安全的作法,是仔細預覽結果,或留在能感知格式的編輯器中操作。

固定寬度的資料也是如此。期望接收端維持位元組穩定欄位的 CSV 檔、欄位偏移固定的紀錄樣本、序列化結構化文字,以及任何把空白當作分隔符號的格式,都無法在不做特殊處理的情況下撐過一次通用清理。同一份警覺也適用於詩歌——那裡的換行是作品的一部分——以及行斷點會影響分頁的法律文字。

如果行斷點本身就是唯一需要處理的問題,line break remover 是更聚焦的選項,因為它只會取代或正規化換行,不會動到每一行中的其他空白。本頁的三種模式刻意設計成更廣用的工具,而工具越通用,在把任何東西複製到下游之前做好預覽就越重要。

瀏覽器工具、上傳服務或腳本

替代工具可以分成三類,而每一類都各自取捨不同的東西。

瀏覽器型工具在目前分頁中執行,會在文字離開裝置之前顯示精確的轉換結果,並提供少量明確的模式。它的成本在於使用者必須自己選對模式;好處是這個選擇是可見的。Whitespace Remover 頁面會記載每個模式保留什麼、捨棄什麼,讓選擇能看著螢幕上的後果來進行,而不是事後才來後悔。

以上傳為基礎的服務會接收文字、在它自己的伺服器上執行,然後回傳清理過的結果。它的成本是私人文字跨越了讀者無法掌控的網路邊界;好處是某些服務會額外打包一些清理動作,例如智慧引號轉換、Unicode 正規化或 HTML 剝除等,而刻意設計得狹窄的瀏覽器工具並不會執行這些動作。Whitespace Remover 明說它不會執行這些步驟——不會自動進行拼字、標點、Unicode 正規化、HTML 解析、Markdown 解析、智慧引號轉換、去除重複或大小寫轉換,也不會保留剪貼簿中的富文字樣式,因為輸入是純文字。

以 Python、JavaScript 或 shell 寫成的本地腳本是最有彈性的選項,因為使用者可以自己撰寫轉換。它的成本是同一支腳本對不同的輸入可能產生不同的結果——一個會悄悄吃掉換行的模式就是典型的例子——而且輸入一變動,讀者就得重新讀一次那段正則表達式。一個專門打造的工具有助於免去那段正則表達式的麻煩,代價是少了一個可自訂的旋鈕,而大多數替代工具的搜尋,正是想在不察覺的情況下把這個旋鈕贏回來。

對大多數尋找空白字元移除替代工具的使用者來說,決定性的問題是:對下一個接收端而言,文字的哪一項特性最重要。需要保留段落的散文指向收合模式加上瀏覽器工具。需要每一行都被修剪並排列整齊的清單與紀錄,指向修剪行模式搭配同一個工具。緊湊的機器權杖則指向全部移除模式,但要心裡有數:詞彙與資料紀錄會因此黏合在一起。這三種模式都不需要上傳、不需要正則表達式,也不需要伺服器來回,正是大多數替代工具搜尋背後真正想要的特性。