繁體中文

文字與日常工具·文字工具包

slug 產生器如何摺疊重音:NFD 分解解釋

· 工作原理

url-slugs 文字轉換 JavaScript

重音字母在成為 URL slug 之前分為基本字母和標記
原始 ToolAcre 向量圖

解釋 Unicode 規範分解如何將基本字母與其重音分開,以便「Café Crème」變成cafe-creme而不是caf-cr-me,以及單獨分解的不足之處。

caf-cr-me — 破壞名稱的常見蛞蝓 bug 及其發生原因

弱 slug 例程刪除狹窄 ASCII 範圍之外的每個字元時,它可以將 `Café Crème` 轉換為 `caf-cr-me` 。可見的重音符號消失了,但底層的基本字母也隨之消失,留下的 URL 不再類似文章標題。這種損害在名稱、地點和重複的編輯類別中尤其明顯。

ToolAcre 在 `slugify` 中採取不同的路徑。它首先將輸入標準化,然後刪除特定範圍的組合標記,同時保留結果字母。只有之後它才會將文字和形狀分隔符號小寫。這個順序是 `Café Crème` 變成 `cafe-creme` 而不是缺少母音的片段的原因。

一個字符,兩種表示形式 — é 如何成為單一代碼點或 e 後跟組合銳音符

看起來相同的文字可以有不同的內部序列。 `é` 可以作為一個預組合字元到達,也可以作為一個普通的 `e` 後接一個組合尖銳標記到達。內容編輯器通常無法看到哪個表示來自 CMS、檔案或剪貼板,但逐字過濾器可以以不同的方式處理這兩個輸入。

當替換規則識別一種形式而不識別另一種形式時,這種隱藏的差異就很重要。 ToolAcre 避免為每個預組合拼字編寫單獨的替換。規範化為 slug 管道提供了一種更一致的中間形式,因此可以透過後續步驟刪除受支援的重音符號,同時基本字母仍可用於 URL。

規範化形式 D — 規範分解如何將每個重音字母重寫為基本字母加上組合標記

此實作在任何小寫或分隔符號工作之前呼叫 `.normalize("NFD")` 。對於具有由 JavaScript 執行時處理的規範分解的字符,這會產生一個基本字符,後面跟著一個或多個組合標記。該函數不維護自己的法語或西班牙語拼字目錄,也不從語義上檢查單字。

該大綱稱 NFD 重寫了每個帶有重音的字母,但消息來源支持更狹窄的說法。分解取決於字符,以下刪除表達式涵蓋從 `U+0300` 到 `U+036F` 的程式碼點。因此,本文應該描述程式碼所示範的行為,而不是承諾對每個腳本或標記進行通用重音刪除。

NFD分解支援的字元;此實作並不保證每個重音字母都會分開

規範化後,`slugify` 套用 `/[̀-ͯ]/g` 並用空字串取代每個匹配標記。在 `é` 的分解形式中,`e` 與該範圍不匹配,而銳角標記則匹配。僅刪除標記會留下可讀的基本字母,而早期的僅 ASCII 方法會丟​​棄這些字母。

這是重音折疊,而不是一般的文字清理過程。正規表示式故意放置在分隔符號規則之前,允許基本字母稍後作為字母參與。如果在無支撐的執行已經折疊之後進行標記去除,則分解的標記可能會影響分隔符號的放置並產生不太忠實的段塞。

slug 管道的其餘部分 - 小寫、折疊非字母數字執行到單個連字符、修剪前導和尾隨分隔符、刪除表情符號

其餘管道將標準化文字小寫,並將每個不是 Unicode 字母或數字的執行替換為配置的分隔符號(預設為連字號)。第二個表達式修剪兩端重複的分隔符號。因此,表情符號和標點符號作為內容消失,而相鄰的不受支援的字元則成為一個邊界而不是幾個連字符。

輪廓描述了非字母數字折疊,但實際模式使用 Unicode 屬性轉義,而不是純 ASCII 字母表。非拉丁字母的字母在小寫後可以保留在段落中。配置確認沒有音譯步驟:符號被刪除,但保留的字母不會自動重寫為近似的拉丁語拼字。

該 slug 管道的其餘部分保留任何腳本中的字母和數字,同時用所選分隔符號替換其他執行

遵循 `Café Crème & Co. — Été 2024!` 完成實施。 NFD 將支援的重音字元分為基本字母和標記。標記刪除表達式留下 `Cafe Creme & Co. — Ete 2024!`,小寫會在標點符號處理之前產生 `cafe creme & co. — ete 2024!`。

非字母和非數字的執行然後變成連字符,在修剪前導和尾隨分隔符後產生有意義的序列 `cafe-creme-co-ete-2024` 。 & 符號、句號、破折號和感嘆號不接受口語名稱或自訂替換。它們僅充當此轉換中字母和數字執行之間的邊界。

分解不能做什麼 - 像 ø、ł、ß 和 æ 這樣的字母沒有重音可以去除,需要一個音譯表

分解不是音譯。诸如 `ø`、`ł`、`ß` 和 `æ` 之类的字符在此管道之后仍然是 Unicode 字母,因此基于属性的过滤器会保留它们,而不是查询 `o`、`l`、`ss` 或 `ae` 的表。聲稱使用者需要音譯表可能在其他地方是有用的設計建議,但此工具中不存在這樣的表。

這種差異也解釋了為什麼結果可能是有效的項目 slug,而不是純 ASCII。出版系統需要 ASCII 的編輯者應在使用輸出之前檢查單獨的系統約束。 ToolAcre 承諾對已實現的分解和標記範圍進行重音折疊;它不承諾為每個標題提供語言感知拼字、可逆轉換或拉丁語輸出。

沒有可去除標記的字元仍然是字母;該工具沒有音譯表

可靠的要點是程序性的:首先標準化,刪除支援的組合標記,小寫,折疊不受支援的執行並修剪分隔符號。每個階段都有一個可見的職責,並它們的順序在標點符號被丟棄之前保留基本字母。這足以防止常見的 `caf-cr-me` 失敗,而無需發明原始碼不包含的語言規則。

將工作後的標題貼到文字大小寫轉換器中,然後選擇 slug 選項以在相同文字方塊中檢查最終結果。如果標題包含所示範的重音大小寫以外的字母,請根據目標平台檢查輸出。轉換器提供可預測的瀏覽器端轉換,而編輯器仍然負責路由約定。