6

Unicode正規表現のサポートのさまざまなレベルは、UTS#18で説明されています。

要件ごとにいくつかのテストを行う方法はありますか?テストを問題の言語に移植し、実行して結果を収集することは可能ですか?

他のUnicodeドキュメントにも、文字列の実装/ライブラリなどのサポートレベルの概念がありますか?

4

2 に答える 2

7

ちなみに、ICU4CとPerlはどちらもUTS#18レベル1と、いくつかの重要なレベル2機能をサポートしています。これらには、の名前付き文字\N{...}、の書記素、の\Xような完全なプロパティが含まれ\p{East_Asian_Width=Full_Width}、ICUの場合は、微調整によるより洗練された単語のデフォルト境界も含まれます\b。これらの3つのレベル2正規表現機能はすべて、Unicodeでの正規表現の使用を大幅に容易にします。これらがないと、せいぜい不快なことをしなければならず、最悪の場合はまったくできません。

ただし、PerlとICU4Cは多少異なり、Perlは完全な文字列ベースのケースフォールディングをサポートしますが、ICUは単純なcharベースのケースフォールディングのみをサポートします。Perlには、ICUがサポートしていない非Unicode正規表現拡張機能もかなりあります。たとえば、正規表現内のルックアラウンドや名前付きグループなど、どちらも非常に便利です。

Perlでは、ユーザー定義/カスタムプロパティと名前付き文字も使用できます。これは、私用領域(PUA)コードポイントを含む多くのことに役立ちます。これにより、使用したいPUA文字に独自の名前とプロパティを定義できるようになります。(たとえば、非公式のConScriptレジストリにあるスクリプトなど、Unicodeに含めるようにスケジュールされているスクリプトの場合。)

Javaは、ごく最近リリースされたJDK7まで、UTS#18レベル1でさえサポートせず、その後は最小限しかサポートしません。Java6以前では、あらゆる種類の小さなものが間違っているか、欠落しています。全体として、JDKでのJavaのUnicodeサポートは非​​常に弱いです。本格的なUnicode作業には、OraSunクラスではなくUCharacter、ICU4Jなどのクラスを使用する必要があります。本当に。

しかし、それらの数を超えて、他に何も近づいていません。 注意深く、あまり多くのことをする必要がない場合は、PythonまたはRubyで足を引きずることができます。たとえば、並べ替えや検索、実質的にUnicode文字プロパティ、適切な単語境界さえありません。

JavascriptまたはPHPでUnicodeを使って実際に何かをしようとしている人は、始める前にやめるべきです。文字のプロパティやおそらく書記素にアクセスしないと、Unicodeを便利で現実的な方法で操作できないため、非常に苦痛です。

ケースマッピングとケースフォールディング、正規化、改行、照合などの言語間のUnicodeの問題もあり、これらはすべて言語によって異なります。Unicodeを機能させるには、すべてではないにしてもほとんどの機能にアクセスする必要があります。文字プロパティは多くのアルゴリズムが依存する基盤であるため、完全なプロパティサポートがないことは、ほとんどすべての言語での実際の問題です。

このほとんどについては、UnicodeSupportShootoutの講演で話します。

結論

肝心なのは、この記事の執筆時点で、ICU正規表現またはPerl自体(PCREは使用できない)、またはregexPythonのMatthew Barnettライブラリも使用できない場合、基本的にUnicode正規表現に悩まされているということです。Unicodeは20年前のものですが、現在、正規表現やUnicodeを真剣に受け止めている人は他にいません。

これは、JavascriptやPHPなどの「webbish」言語に深刻な影響を及ぼします。使用可能な代替手段がないためです。したがって、webbish言語はUnicodeを合理的に処理できないため、実際の作業を別のサーバー側言語にオフロードする必要があります。ファッション。クライアントサイドで機能するものは何もありません。これは深刻な負担です。

また、Javaを介してICU正規表現を取得するには、ICU4Cを取得するために独自のJNIをロールする(またはAndroidからのJNIを使​​用する)必要があることに注意してください。ICU正規表現にはICU4Jバインディングはありません。

于 2011-08-20T04:09:22.527 に答える
3

サポートレベルを検証する既存のテストがどこかにあると思います。
たとえば、Perlには、正規表現での
Unicodeサポートと一般的な言語でのUnicodeサポートに関するかなり広範なドキュメントがあります。

Perl正規表現サポートレベルのドキュメントの例:http:
//perldoc.perl.org/perlunicode.html#Unicode-Regular-Expression-Support-Level

Unicodeは非常に複雑ですが、テストケースは言語作成者から提供されます。

于 2011-08-19T19:37:01.523 に答える