1

私たちの目標は、SQLite データベースの大文字と小文字を区別しない照合を作成することです。複数のプラットフォームでこれを行いましたが、iOS には一貫した問題があり、(時折) 破損した DB インデックスに現れるようです。長い実験の結果、問題の原因は CFStringCompare() 関数であり、理論上の規則に違反していると結論付けました。

ACC。理論的には、比較関数は再帰的、対称的、および推移的でなければなりません。

私たちが行ったことは、ランダムな文字列を生成し、CFStringCompare() が上記のプロパティを満たすかどうかをテストすることでした。

サンプルの問題は次のとおりです。

"Я7;1FC9" > "SДA`\"0l"
"SДA`\"0l" > "Я7;1FC9"

つまり、A>B と同時に B>A!

より多くのフラグの組み合わせをテストしました:

  • kCFCompareNonliteral は同様の問題を示しました
  • kCFCompareLocalized は最悪のオプションであることが証明されています (ほとんどの問題)

iOSで大文字と小文字を区別しない比較を実現する安全な方法を知っている人はいますか?

4

1 に答える 1

0

わかりました、返信がないので、自分で返信してみます。

まず第一に、このリンクなど、他の人が同様の問題を観察しました。ドイツ語の ß にも多くの問題が見られたことに注意してください。たまたま別の例を選びました。

CFStringCompare の実装にはバグがあり、並べ替えには使用できないと言えます。

一方、ICU ライブラリがあり、UCA への完全な準拠を宣言しています (たとえば、こちら)。これは、すべての理論的規則に従う必要があります。

したがって、私の答えは次のようになります。CFStringCompare にはバグがあります。ICU を使用してください。

(ICUライブラリのサイズが大きいため、別の回答を希望しました)

于 2013-10-09T13:18:37.473 に答える