繁體中文

開發者工具·文字比較

大小寫摺疊比看起來更難:Unicode 中「忽略大小寫」的意思

· 背景

文字差異 統一碼 區分大小寫

大寫和小寫線路鍵聚合,而一種特殊形式保持分離
原始 ToolAcre 向量圖

解釋了為什麼忽略大小寫對於 ASCII 來說是微不足道的,而對於 Unicode 來說是微妙的,以無點 i、銳號 s 和最後的 sigma 為例,以及這對於任何不區分大小寫的比較意味著什麼。

為什麼伊斯坦堡的兩個拼字可能不匹配 - 以涉及土耳其點點大寫 I 的現實世界不匹配開頭,這讓英語開發人員感到驚訝

不區分大小寫的比較聽起來很普遍,除非識別碼、腳本和語言規則不一致。 ToolAcre 的實際規則是具體的:當選擇「忽略大小寫」時,每個行鍵在任何空格轉換後都會接收 JavaScript `toLowerCase()`。然後嚴格相等比較結果字串。

此機制對於標題或普通標籤很有用,但其名稱不應擴展為區域設定感知的語言平等。 UI 不收集任何區域設置,函數也不提供任何區域設置。每當案例帶有身份或語言含義時,讀者都應該檢查結果。

ASCII 大小寫:一位 — 解釋了簡單的大寫和小寫關係,使早期工具的忽略大小寫標誌變得容易

此工作簿將 ASCII 大小寫描述為單位關係,但原始碼未實現位元算術或純 ASCII 分支。它在整行上呼叫平台字串方法。歷史編碼解釋需要此儲存庫之外的來源。

對於基本拉丁文字,`Hello` 和 `hello` 在該選項下變得相等,正如測試套件所證明的那樣。該測試建立一種行為,而不是每個 Unicode 映射。避免將一個簡單的英語範例變成對所有腳本的承諾。

此實作呼叫 JavaScript toLowerCase;它不公開 ASCII 特定的位元操作

Unicode 大小寫摺疊是一個有自己的資料和狀態規則的比較概念。 ToolAcre 不會呼叫命名折疊庫、規範化字串或記錄 Unicode 版本。稱這種實現為「全箱折疊」就等於聲稱不存在機械裝置。

合理的描述是使用目前 JavaScript 引擎的小寫鍵比較。原始行保持不變以供顯示。如果降低的字串長度或程式碼點不同,則該行仍然是刪除和添加,而不是強制匹配。

ToolAcre 執行小寫映射,而不是記錄的 Unicode 大小寫折疊操作

大綱名稱為土耳其語 I、德語升號 s 和希臘語 sigma。這些是外部來源的 Unicode 文章的合法主題,但此儲存庫不包含保證它們結果的表或測試。本文故意避免宣告精確的映射。

在建立身分規則之前測試目標環境中的實際值並查閱權威的 Unicode 和區域設定檔案。用於視覺檢查的便利複選框不應成為使用者名稱比較器、安全邊界或多語言校對引擎。

命名語言例外需要外部 Unicode 來源,此處不保證

將 `Release Notes` 與 `release notes` 進行比較。嚴格模式報告替換;忽略大小寫會報告相同的行並顯示原始的左側文字。添加標點符號或重音變化,並觀察到僅小寫並不能消除所有差異。

此受控範例示範了該選項,而無需假裝解決特定於腳本的行為。查看術語表時,首先執行嚴格模式並記錄僅區分大小寫的行。之後切換該選項,將大寫噪音與拼字或標點符號變更分開。

工作範例:測試普通拉丁語變體,而不泛化到每個腳本

UI 中沒有出現區域設定選擇器,且 `toLowerCase` 不接收任何語言參數。因此,無論檔案的目標語言如何,都會執行相同的轉換程式碼。該路線不知道線路是土耳其語、德語、希臘語還是程式標識符。

這種缺席是實際的警告。對於區域設定感知的搜尋、排序或識別,請使用圍繞這些要求設計的 API,並使用適當的資料固定其行為。文字差異是審閱者對兩個字串的觀察,而不是全域命名策略。

此比較選項未提供區域設定參數

本文不承諾非拉丁等效性、規範化、排序規則或針對易混淆字元的安全性。小寫無法回答兩個名稱是否指同一個人、產品或檔案系統物件。這些系統可能會應用完全不同的案例規則。

忽略空格可以與大小寫結合使用,但這樣做會擴大消失的範圍。一次切換一個選項以確定原因。兩者的結果相同,僅說明轉換後的線路鍵匹配;它沒有提到位元組相等或語義。

重點:為了方便而忽略大小寫,而不是為了正確性 — 總結 ToolAcre 文字比較中的選項何時合適以及何時檢查結果

當已知大寫是表示幹擾時,為了方便起見,請使用「忽略大小寫」。對程式碼、路徑、產品名稱和大小寫可能區分值的任何領域保持嚴格模式。檢查兩個輸出,而不是將較寬鬆的結果作為唯一的記錄。

ToolAcre 的實作足夠透明,可以精確地說明:可選的空格處理,然後是 JavaScript 小寫映射,然後是嚴格的行鍵相等。這種溫和的主張比來源無法支持的廣泛的 Unicode 承諾更有用。