15

これは主に、私が非常に興味を持っている理論上の質問です。(私はそれを自分でコーディングすることによってこれを行おうとはしていません。私は車輪を再発明していません。)

私の質問は、Unicodeで等価の大文字/小文字のテーブルがどのように機能するかです。

たとえば、ASCIIでこれを行う必要がある場合は文字を取得し、それが[az]の範囲内にある場合は、Aとaの差を合計します。

それがその範囲に当てはまらない場合は、10個程度のアクセント付き文字とñの小さな等価テーブルがあります。(または、256エントリの完全な等価配列を作成することもできますが、そのほとんどは入力と同じです)

ただし、数十万の文字があり、理論的には新しい言語または文字のセットを追加できることを考えると、Unicodeで同等性を指定するためのより良い方法があると思います(そして私はあなたがその場合、ウィンドウにパッチを適用する必要はありません)。

Windowsには、文字ごとにハードコードされた巨大な同等性テーブルがありますか?または、これはどのように実装されますか?

関連する質問は、SQLServerがUnicodeベースのアクセントと大文字と小文字を区別しないクエリをどのように実装するかです。éëèEÉÈとËがすべて「e」と同等であることを示す内部テーブルがありますか?

文字列の比較に関しては、それほど速くは聞こえません。

どのようにしてインデックスにすばやくアクセスしますか?そのフィールドの照合に対応する「ベース」文字に変換された値にすでにインデックスを付けていますか?

誰かがこれらのものの内部を知っていますか?

ありがとうございました!

4

4 に答える 4

16

この質問のMSSQLServerの部分について説明しますが、「正しい」答えは、実際にはサポートされている言語とアプリケーションによって異なります。

SQL Serverでテーブルを作成する場合、各テキストフィールドには暗黙的または明示的に指定された照合があります。これは、ソート順と比較動作の両方に影響します。ほとんどの英語(US)ロケールのデフォルトは、Latin1_General_CI_AS、またはLatin 1、大文字と小文字を区別せず、大文字と小文字を区別します。つまり、たとえば、a = Aですが、a!=Äおよびa!=äです。「A」のすべての発音区別符号のバリエーションを同等に扱うアクセント非依存(Latin1_General_CI_AI)を使用することもできます。

一部のロケールは、他のカテゴリの比較をサポートしています。たとえば、フランス語では発音区別符号を含む単語の順序がドイツ語とは多少異なります。トルコ語では、ドットなしのiとドット付きのiは意味的に異なると見なされるため、トルコ語、大文字と小文字を区別しない、アクセントを区別する照合を使用する場合、大文字と小文字を区別しない比較でも一致しません。

データベースごと、テーブルごと、フィールドごと、さらにはクエリごとに、ある程度のコストをかけて照合を変更できます。私の理解では、インデックスは指定された照合順序に従って正規化されます。つまり、インデックスは基本的に元の文字列のフラット化されたバージョンを保持します。たとえば、大文字と小文字を区別しない照合では、Appleとappleはappleとして保存されます。クエリは、検索前に同じ照合でフラット化されます。

日本語では、別の正規化のカテゴリがあります。ここでは、全角形と半幅形の文字がa = のようになり、場合によっては、2つの半幅形の文字が1つの意味的に同等の文字にフラット化されます(バ= 15 ' 最後に、一部の言語では、複合文字を含む別のワックスのボールがあり、孤立した発音区別符号を他の文字で構成できます(たとえば、äのウムラウトは1つの文字であり、単純な形式aで構成されます)。ベトナム語、タイ語、およびその他のいくつかの言語には、このカテゴリのバリエーションがあります。標準形がある場合、Unicode正規化により、合成された形式と分解された形式を同等として扱うことができます。Unicode正規化は通常、比較が行われる前に適用されます。

要約すると、大文字と小文字を区別しない比較では、ASCII範囲の文字列を比較する場合とほぼ同じように行います。たとえば、比較の左側と右側を「小文字に」フラット化してから、配列をバイナリとして比較します。配列。違いは、1)文字列を同じUnicode形式(kCまたはkD)に正規化する必要があることです。2)そのロケールのルールに従って文字列を同じケースに正規化する3)アクセント感度ルールに従ってアクセントを正規化する4)バイナリ比較に従って比較します。4)ソートの場合など、該当する場合は、追加の2次および3次ソート規則を使用して比較します。これには、一部の言語では「M」の前の「Mc」ソートなどに類似したものが含まれます。

そして、はい、Windowsはこれらすべてのルールのテーブルを保存します。コントロールパネルからの東アジア言語サポートと複雑なスクリプトのサポートでそれらのサポートを追加しない限り、すべてのインストールでデフォルトでそれらのすべてを取得するわけではありません。

于 2008-11-18T06:00:36.147 に答える
12

1:1のマッピング比を持つすべてのケースマッピングを含むマッピングファイルがあります。通常、オペレーティングシステム/フレームワーク/ライブラリは特定のバージョンのUnicodeをサポートします。この場合、マッピングファイルはバージョン管理されているため、特定のOS/フレームワーク/ライブラリ/サポートするUnicodeのバージョンに応じたマッピングを取得できます。

Unicodeケースマッピングの詳細については、http://www.unicode.org/faq/casemap_charprop.htmlを参照してください。

于 2008-11-18T02:54:29.767 に答える
3

ほとんどの書記体系には、大文字と小文字が別々にありません。ウィキペディアによると、例外には「ローマ字、ギリシャ語、キリル文字、アルメニア文字」が含まれます。

ですから、心配する文字はそれほど多くありません。このページは、広範囲の文字が大文字に1を加算して小文字に相当するものを取得するという単純なスキームに従っていることを示しています(もちろん、いくつかの例外があります)。

于 2008-11-18T03:02:36.660 に答える
1

何をしようとしているのかにもよりますが、正しい答えはもう少し複雑です。

アプリケーションのソートまたは検索のために文字列を比較する場合、使用する正しいアルゴリズムはUTS #10: "Unicode Collat​​ion Algorithm" で指定されています。大文字と小文字を区別しないことはその一部ですが、多くの文字を表すにはさまざまな方法があり、多くの場合、アプリケーションはさまざまな表現を同等のものとして扱う必要があります。

ソート規則はロケールに依存します。これは主に、結果をユーザーに表示するために並べ替える場合の問題です。ルールを無視すると、ユーザーがイライラするだけでなく、セキュリティ上の脆弱性が生じることさえあります。

表示目的で単語を大文字にしようとしているだけの場合、そのルールも扱いにくい場合があります。1 対多の変換やその他の問題があります。ロケールによっては、同じ文字でも大文字が異なる場合があります。単語内の文字の位置によって違いが生じることがあります。また、各単語の最初の文字を大文字にするだけの「タイトルケース」という明確な概念もあります。文字のタイトルケースが大文字と同じでない場合があります。

于 2008-11-18T21:11:03.063 に答える