2012-02-10 18 views
2

Unicode準拠とは別のUnicode Technical Standard#10(UCA)での照合は、そのことについて疑問がある場合に備えて、順序付け/並べ替えだけでなく比較も含めると "文字列2 "。 2つの文字列で同じ値でないコードポイントは、少なくとも照合と比較の目的で等しいとみなされることがあります。少なくとも、これはPerl標準ライブラリの観点から話しているblog postによって暗示されています。Delphi用のUnicode照合アルゴリズム(UCA)コードはありますか?

私が知りたいのは、(a)Delphi XE2は既にUnicode Collation Spec全体を完全に実装していますか(b)そうでない場合は、第三者のライブラリがそうしていますか?

サンプルコード:

Str1 := Chr($212B); 
Str2 := Chr($C5); 
n := CompareStr(Str1,Str2); // in delphi this is not zero, under UCA rules, should be 0. 

Unicode照合順序の仕様によると、Unicode照合順序は、比較の下で同等の上記のすべてのコードポイントを考慮する必要があります。これはバイナリの観点からは意味をなさないので、DelphiのCompareStrもperlの(リンクされた記事の)cmpもUnicodeの不具合で汚染されていませんが、ユニコード対応Delphiでの照合、perl Unicode :: Collat​​ionライブラリのように?どうやって?

更新AnsiCompareStrは、Win32 CompareStringを呼ぶだろうし、上記のようないくつかのロケール固有のケースを扱うだろう、とインターネットを中心に読んでから、WindowsのクラシックUnicode照合順序の挙動とUCAは、UCAがに見せかけて、ゆっくりとではなく、完全に収束していますそれはWindowsの照合のように変更されるものです。

答えて

7

(a)No.デルファイのAnsiCompareStrとco。 Win32 CompareString関数をラップします。これはdoes not followユニコード照合アルゴリズムです。

は、(b)はICUプロジェクトはそれをサポートしていますが、Delphiのラッパー、ICU4PASは、しかし、あなたのために必要ではないかもしれない2007年

以降に更新されていません。あなたがあなたの行動を見る理由は、AnsiCompareStrの代わりにCompareStrを使用しているためです。 ANSI以外のバージョンは、SysUtilsのasmで書かれ、char-by-charを比較し、等価性や文字の組み合わせを考慮しません。大文字と小文字を区別しないバージョンのCompareTextもa-zでのみ動作します。 ANSIバージョンは内部的にCompareStringを呼び出しますが、これはロケール対応であり、これらすべてのケースを処理します。

これは、SysUtilsのルーチンにしか当てはまりません。 StrUtils.pasでは、ANSI以外のバージョンはANSIバージョンのまさにインラインラッパーであるため、すべてがロケールに対応しています。

+0

ICUラッパーは直接実装しませんが、C/C++ ICUライブラリーコードのみをラップします。 –

+0

リンクが良好です。 UCAがMicrosoftの主導権を守っていない理由は何故だろうか。 MSはネイティブのUTF-16を初めて使用し、データベースとUnicode照合のすべてを懸念していたためです。 –

+0

@ウォーレン、そうだよ。私はDelphiネイティブの実装について認識していません。 NexusDBのThorsten Englerも同じことを探していました。完全なUCA互換性が必要な場合は、直接問い合わせてください。私の編集も参照してください。あなたの元の投稿の一部を見落としたからです。 –

関連する問題