![追加のPOSIX「文字クラス」提案[閉じる]](https://linux33.com/image/168755/%E8%BF%BD%E5%8A%A0%E3%81%AEPOSIX%E3%80%8C%E6%96%87%E5%AD%97%E3%82%AF%E3%83%A9%E3%82%B9%E3%80%8D%E6%8F%90%E6%A1%88%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
POSIXには、次のように定義された「文字クラス」があります。LC_CTYPE ロケール定義次のような(12)名前があります。
alnum alpha blank cntrl digit graph lower print punct space upper xdigit
として使用されます[[:lower:][:digit:]]
。
それぞれは非常に正確な文字リストを定義するように設定されています。
たとえば、digit
文字のみを含める必要があります0123456789
。
しかし、時間が経つにつれて使用されるとaの正確な定義はdigit
絶えず変わっています。。 Perlは明らかに.Grep以上と一致する可能性0123456789
があります0123456789
。
$ echo '0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९' |
grep -o '[0-9]\+'
0123456789
٠١٢٣٤٥٦٧٨
۰۱۲۳۴۵۶۷۸
߀߁߂߃߄߅߆߇߈
०१२३४५६७८
これは、一般的に使用される文字の国際化への圧力によるものです。例:ギリシャ国民の場合は、αβγδεζηθικλμνξοπρσςτυφχψω
次のように考えます。減らす大文字と小文字。しかし、これは定義されていません。実際、これらのすべての「文字クラス」にはこれらの制限が追加されます。POSIXページ定義:
POSIX ロケールで
これは、文字クラスがCロケールでのみ定義され有効であることを示します。
これは、安定した、明確に定義された文字のリストを必要とするプログラマーにとって最も便利です。
これは、プログラマにとって合理的に見えることだけを[0-9]
意味できます。繰り返しますが、これはプログラマーにのみ意味があるようです。しかし、「小文字」と読む場合、ギリシャ国民には文字を含まないことが不合理に見えるはずです。これは、コンビネーションオーダーのユーザー(Cを除く)にとっては不合理に見えるかもしれませんが、これは、無実のユーザーにとって予期しないことです。多くのユーザーが範囲に大文字が含まれていると文句を言った。0123456789
[a-z]
abcdefghijklmnopqrstuvwxyz
[a-z]
αβγδεζηθικλμνξοπρσςτυφχψω
[a-z]
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYz
[a-z]
簡単に言えば、文字クラスはCロケールに対してのみ定義されます。
残りのロケールはまだ定義されていないため使用できません。ギリシャ語では小文字を要求できません。または文字の範囲内に含めます。 Webページですべての言語を簡単に使用できる今日のコンピュータの世界では、これは衝撃的なことです。
これでこれを改善できます。
現在の多様性を制限しようとする説明は失敗する可能性が高いです。新しい構文が必要です。文字クラスを拡張して、文字クラスが望む意味を正確に書くとどうなりますか?
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など)でこのアイデアを実装するには、誰に連絡する必要がありますか?
答え1
この問題は、POSIXのワイド文字機能を使用して解決されました。から始まる<wctype.h>
そして<wchar.h>
、これは以下に関連しています。現在のロケールと<locale.h>
これがどのロケールかを指定するために使用されます。
正規表現で関連していない複数のロケールを参照するために特別な構文を追加する必要性を発見した人は誰もいないようです。
答え2
一部のユーティリティ(grep、sed、bashなど)でこのアイデアを実装するには、誰に連絡する必要がありますか?
すでに一定レベルの支援が行われている。たとえば、「é」はフランス語のロケールでは小文字として認識され、「α」はGNU Cライブラリとそのロケール定義を使用するシステムではギリシャ語のロケールの小文字として認識されます。GNU Cライブラリで定義されているペルシャ語は0123456789を使用します。場合によっては(特に修飾子scanf
の場合)、「数値」カテゴリには属していませんが、Sharif FarsiWebはこれに関して何をしているのかを知っているようです。printf
I
今日、そのような変更を提案するのはやや複雑です。いつでも参加できますオースティングループそこで問題を議論したり、メーリングリストまたはバグトラッカー(理想的には、しばらくの間メーリングリストに隠れているか、アーカイブを読むことから始めてください。)しかし、POSIXは実際に試してみることができません。運転する既存の実装なしで変更できます。関連するさまざまなツールの開発者に変更を提案できます。おそらく、いくつかのCライブラリまたは他のロケール定義から始めることができますが、緊急の状況(通常は標準要件)がない場合は、あまりにも離れて行く可能性がなく、終了します。キャッチ22の状況に陥った。
今日の最良の選択肢は、大規模なOSエディタの重要な顧客のための有効なユースケースを提示し、そのような変更を推進することです。その後、編集者はあなたに代わってすべてのコミュニティ議論を処理します。