直排文字產生器 API 替代方案是一個本機、瀏覽器為基礎的工具,能產生與開發者 API 相同的由上而下的純文字欄位,但不會將來源字串透過網路傳送。本站的 直排文字產生器 就是這樣的替代方案:貼上最多 5,000 個 Unicode grapheme 簇,從 1 到 100 中選擇一個欄高,選擇由左至右或由右至左的欄位順序,然後下載一個內容與螢幕預覽完全一致的 UTF-8 TXT 檔案。由於斷字是透過瀏覽器的 Intl.Segmenter 以 grapheme 粒度執行(並附有已測試的備援機制),連續的 emoji 序列、膚色修飾符、國旗 emoji 以及組合附加符號都不會像天真的字碼點或 UTF-16 API 那樣被切開。輸出是純文字,欄位之間使用兩個普通空格,而非 CSS writing-mode 標記、影像或帶樣式的文件,因此結果可以貼到任何接受文字的欄位中。不會上傳任何內容;用於下載的 Blob URL 只在點擊時存在,並在之後立即撤銷。
大多數透過這個關鍵字進入本站的讀者已經知道直排文字 API 的功能:它接受一個字串、一個欄高和一個書寫方向,然後回傳由上而下堆疊在欄位中的字元。摩擦通常出現在整合階段、隱私審查或帳單上。以下是一個實用指南,說明如何在此特定任務中擺脫對 API 的依賴,並將直排文字產生器作為這些 API 通常產生之純文字直排配置的即插即用替代品。

為什麼開發者會尋找直排文字產生器 API 替代方案
「API 替代方案」這個說法通常出現在開發者想要與遠端端點相同的輸出形式,但不想承擔呼叫它的營運負擔時。原因通常會聚集在一個簡短的清單中:
- 不需要身分驗證,因為沒有 API 金鑰需要佈建、儲存在密鑰管理器中,或在隊友離開時輪替。
- 沒有網路往返意味著版面是由將貼上或提交結果的同一台機器產生,這消除了延遲、地區路由和服務中斷的風險。
- 隱私和資料落地問題消失了,因為來源字串從不離開瀏覽器分頁,這對內部文件、面向客戶的草稿或任何需要經過安全團隊審查的內容都很重要。
- 以用量計費被一次性互動使用所取代,對於偶爾或一次性的工作來說更便宜,並從程式碼審查中移除了「誰來付費呼叫」的問題。
- 版本控制不是問題,因為本文描述的規則就是該工具今天實作的規則,任何未來的變更在下載前都會在預覽中顯示。
對於中小型工作量來說,所有這些原因都歸結為同一個觀察:該 API 從未做任何瀏覽器無法使用相同 Unicode 斷字在本機完成的工作。
直排文字產生器的輸出內容
該工具不會產生影像、帶樣式的文件或 CSS writing-mode 標記。它產生可攜帶的純文字。對於給定的來源字串、瀏覽器斷字行為、欄高和欄位方向,確切的儲存格順序是確定性的,因此每次使用該工具時,相同的輸入都會產生相同的可列印結果。
以下是一些常讓習慣使用 API 的人感到驚訝的細節:
- 欄位之間以兩個普通空格連接,這意味著結果在等寬字型中看起來很整齊,但它不是一欄由全形字元組成的字串。
- 在較短的最後一欄中缺少的儲存格只有在需要保持後續欄位對齊時才會呈現為全形空白。視覺右側邊緣缺少的儲存格會被省略,以免輸出列增加不必要的尾端填補。
- 現有的 CRLF、獨立 CR 和 LF 換行在 grapheme 版面配置之前,各自變成一個全形空白儲存格。它們不會啟動一個新的獨立直排區塊,這在保持一個可預測的矩形版面的同時,保留了序列中可見的間隙。連續的換行會產生連續的空白儲存格。
- 輸出是純文字,仰賴目的字型一致地處理所選字元和全形空白。等比例字型、emoji 後備字型、定位符號和混合寬度的文字可能會讓欄位看起來不均勻,即使底層的儲存格序列是正確的。
作為一個快速的健全性檢查,考慮一個最大欄高為 100 的 5,000 grapheme 輸入。將 grapheme 數除以高度得到 5,000 ÷ 100 = 50 欄,這正好位於該工具的輸出欄數上限。相同的 5,000 grapheme 在高度為 50 時會需要 100 欄,這超過了 50 欄的上限,因此該工具會以明確的錯誤拒絕該組合,而不會產生極寬的預覽。
三個步驟在瀏覽器中執行直排版面配置
互動刻意設計得很短,因為目標是取代 API 呼叫,而不是學習新的編輯器。
- 輸入要排列的文字並選擇 1 到 100 的欄高。預覽中顯示的字元數反映的是 grapheme 簇,而非原始 UTF-16 字碼單元,因此一個國旗 emoji 或一個膚色序列算作一個儲存格。
- 選擇邏輯欄位是由左至右還是由右至左顯示。由左至右將第一個來源欄位放在視覺左側;由右至左反轉該順序,使第一個來源欄位出現在視覺右側,符合常見的傳統直排閱讀方向。
- 產生版面,檢查 grapheme 和欄數,然後下載 UTF-8 TXT 結果。下載的檔案與預覽字串完全一致,並使用 LF 列分隔符號。Blob URL 只在下載按鈕被點擊時存在,並立即被撤銷。
在兩次產生之間變更文字、高度或方向會清除先前的結果,因此舊的版面不會與當前設定混淆。
API 替代方案的並排比較
下表將直排文字產生器與典型的遠端直排文字端點進行對齊。它不是任何特定產品的基準測試;API 欄描述的是此類服務的通常形式,以便差異可見。
| 能力 | 直排文字產生器(本工具) | 典型的直排文字 API 端點 |
|---|---|---|
| 身分驗證 | 無 | 在大多數設計中需要 API 金鑰或權杖 |
| 網路往返 | 無,在瀏覽器中執行 | 每次呼叫一個 HTTP 請求 |
| 輸入上限 | 5,000 個 grapheme 簇 | 由 API 提供者設定,通常按字元計算 |
| 輸出格式 | UTF-8 TXT 檔案,儲存格順序與預覽完全一致 | 作為 JSON 或文字回應主體回傳 |
| Emoji 處理 | Intl.Segmenter 以 grapheme 粒度執行,並附有已測試的備援機制 | 取決於實作;可能切開 UTF-16 字碼單元 |
| 現有換行 | 每個在序列中變成一個全形空白儲存格 | 不同的 API 以不同的方式處理它們 |
| 每次呼叫成本 | 免費,互動式使用 | 因提供者而異 |
| 確定性 | 對於相同的瀏覽器、來源、高度和方向具有確定性 | 僅在 API 明確記錄其規則時才具有確定性 |
對於快速部署,瀏覽器工具在涉及憑證、計費或隱私的每一行上都勝出。對於 CI 管道或伺服器端批次中的嚴密自動化,API 仍然是更合適的選擇,因為瀏覽器工具是互動式的。
需要規劃的硬限制和邊緣情況
該工具事先公開其限制,因為靜默截斷是耗時最多的故障模式。
- 輸入上限為 5,000 個 grapheme 簇。任何超過此數量的來源字串在斷字之前會被拒絕,因此不會產生部分結果。
- 輸出上限為 50 欄。如果選定的高度會產生超過 50 個欄位,該工具會要求更高的欄位,而不是產生極寬的預覽。
- 高度範圍為 1 到 100。小數或超出範圍的值會產生明確的錯誤。僅接受整數。
- 格式錯誤的 UTF-16 代理項序列會被拒絕。該工具不會嘗試修復損壞的輸入;它會告訴您輸入已損壞。
- 空輸入會被拒絕。該工具不會產生空白版面或全形空白的版面。
- 無效的方向會產生明確的錯誤。僅接受由左至右和由右至左的欄位顯示。
由於輸入是按 grapheme 而不是按字碼點斷字,因此相同的可見字串在計數欄位中可能比天真的字元計數所暗示的更短或更長。如果您正在依 5,000 簇的上限進行預算,grapheme 計數才是重要的數字,而預覽是在下載前確認它的場所。
何時仍應呼叫 API 或使用 CSS writing-mode
此工具不是排版引擎。它是一個純文字版面產生器。對於某些常見的使用案例,這種區別很重要,因為正確的答案既不是此工具,也不是典型的直排文字 API:
- 日文縱中橫排、旋轉的標點符號、ruby 註解以及其他複雜的東亞排版需要真正的版面引擎,而不是帶有插入空格的堆疊字元。
- 中文換行、蒙古文由上而下的版面配置和雙向成形超出了純文字重排的範圍,因為輸出形狀取決於該工具無法測量的字形度量。
- 印刷出版最好由能夠直接控制字形旋轉、度量和頁面幾何的設計應用程式來處理。
- 即時、可存取的網頁排版最好由帶有適當語言標籤的 CSS writing-mode 來處理,因為文字保持響應式、可選擇,並且無需插入空格即可供輔助技術存取。
對於裝飾性標題、詩歌實驗、純文字模型中的直排標籤、簡短的雙語展示、課堂範例和社群貼文,直排文字產生器提供了一個可攜帶的結果,可以貼到任何存在文字欄位的地方,無需 API 金鑰、無需網路呼叫,且沒有意外截斷。
如果您正在權衡選項,空白移除器替代方案:三種模式,無需上傳 詳細介紹了這一點。