Posix

提議的附加 POSIX“字元類”

  • March 7, 2020

在 POSIX 中定義了一些“字元類”,就像在LC_CTYPE 語言環境定義中一樣,具有以下 (12) 個名稱:

alnum alpha blank cntrl digit graph lower print punct space upper xdigit

並用作[[:lower:][:digit:]].

每個都被設置為定義一個非常精確的字元列表。

例如,digit原本打算只包含字元0123456789.

然而,隨著時間和使用,a 的確切定義digit一直在變化。Perl 顯然匹配多於0123456789. Grep 也可能匹配多個0123456789

$ echo '0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९' |
   grep -o '[0-9]\+'
0123456789
٠١٢٣٤٥٦٧٨
۰۱۲۳۴۵۶۷۸
߀߁߂߃߄߅߆߇߈
०१२३४५६७८

這通常是由國際化使用的字元的壓力造成的。例如:對於希臘國民來說αβγδεζηθικλμνξοπρσςτυφχψω,將其視為小寫字母是非常自然的。但這不是已經定義的。事實上,所有這些“字元類”都在其 POSIX 頁面定義中添加了這個限制:

在 POSIX 語言環境中

這表明字元類僅在 C 語言環境中定義(並且有效)。

這對於需要穩定且定義明確的字元列表的程序員最有用。

[0-9]只能意味著0123456789對程序員來說似乎是合理的。

等效地,僅對程序員[a-z]意味著 an 似乎是合理的。abcdefghijklmnopqrstuvwxyz但如果[a-z]讀作“小寫字母”,那麼對於希臘國民來說,不包括任何αβγδεζηθικλμνξοπρσςτυφχψω字母似乎是不合理的。對於整理順序(C 除外)的使用者來說,[a-z]這並不意味著aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYz. 但是,反過來,這對於天真的使用者來說可能是出乎意料的。許多使用者抱怨該範圍[a-z]包括大寫字母。

簡而言之:字元類僅針對 C 語言環境定義。

其餘的語言環境尚未定義,這會阻止它們的使用。沒有辦法要求希臘語中的小寫字母。或者將它們包含在字元範圍內。在當今可以輕鬆在網頁中使用所有語言的電腦世界中,這令人震驚。

現在,我們可以對此進行改進。

試圖限制現在不同的解釋很可能是失敗的。我們需要一種新的語法。如果我們擴展字元類以準確地寫出我們想要它們的意思怎麼辦:

Only digits from ASCII:              [:as:digit:]  <==> 0123456789
Only digits from English:            [:en:digit:]  <==> 0123456789
Only digits from Persian (Farsi):    [:fa:digit:]  <==> ۰۱۲۳۴۵۶۷۸۹
Only lowercase letters from English: [:en:lower:]  <==> abcdefghijklmnopqrstuvwxyz
Only lowercase letters from Greek:   [:el:lower:]  <==> αβγδεζηθικλμνξοπρσςτυφχψω
Only uppercase from Russian:         [:ru:upper:]  <==> БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
.
.
etc.

在任何/所有語言環境中都穩定且相同(如果語言環境可以對字元進行編碼)。

應該聯繫誰來在某些實用程序(grep、sed、bash 可能)中實施這個想法?

應該聯繫誰來在某些實用程序(grep、sed、bash 可能)中實施這個想法?

已經有一定程度的支持,例如在使用 GNU C 庫及其語言環境定義的系統上,“é”在法語語言環境中被辨識為小寫,“α”在希臘語言環境中被辨識為小寫。波斯語,如 GNU C 庫中所定義,在某些情況下使用 ۰۱23۳۴۵۶۷۸۹(特別是,scanfprintf帶有I修飾符),但它們不是“數字”類的一部分,我想 Sharif FarsiWeb 知道他們在這方面做了什麼.

現在建議這種類型的更改有點複雜。您可以隨時加入Austin Group並在那裡討論這個問題,或者通過郵件列表錯誤跟踪器(理想情況下,首先在郵件列表上潛伏一段時間,或者閱讀檔案);但是 POSIX 並不是在沒有任何現有實現的情況下嘗試*推動變革的正確場所。*您可以嘗試向所涉及的各種工具的開發人員建議更改,大概從某些 C 庫或其他庫中的語言環境定義開始,但如果沒有一些緊迫的情況(通常是標準要求),您不太可能走得太遠,所以你最終會遇到一些 Catch-22 的情況。

現在我認為你最好的選擇是為一個大型作業系統編輯器的重要客戶提出一個有效的案例,並以這種方式推動變革。然後編輯會為你處理所有的社區爭論。

引用自:https://unix.stackexchange.com/questions/571393