5

だからここに問題があります。

私は文字列を持っています

    Белый Клык-0.fb2

NSStringメソッドの長さは16を返します

コアデータに文字列を保存した後(バックエンド-sqlite)

NSStringメソッドの長さは17を返しますが、視覚的には文字列は同じままです

    Белый Клык-0.fb2

そして明らかにメソッドisEqualToString:return NO

実験に多くの時間を費やした後、私は問題がこの手紙であることに気づきました:

    й

この文字を削除すると、問題が解決します。

しかし、それは私を夢中にさせ続けています、なぜそのようなことが起こっているのですか?

ここで機能する回避策がありますが、私を満足させないでください:

  1. stringByReplacingPercentEscapesUsingEncoding:-データベースクエリの直後と直後に文字列を変換する必要があります
  2. 文字列全体を音訳する-ちょっとハック

そして、ここでdosntが機能する回避策:

  1. stringWithUTF8String
  2. エスケープされたUTF8文字を元の形式に変換する

CoreDataに保存した後に文字列で何が起こっているのかを理解するのを手伝ってください。

そして、私がしたよりエレガントな解決策はありますか?

4

1 に答える 1

3

この問題は、ユニコードの正規化に関連している可能性があります。したがって、Coredataは分解された文字列を格納しているように見えます(つまりй、2をカウントします。1つは文字用、もう1つはアクセント用です)。これが長さの違いを取得する理由です。Coredataが返すものと比較する前に元の文字列を分解しようとすると、次のように機能するはずです。

[yourOriginalString decomposedStringWithCanonicalMapping]

さて、この背後にある理由は私の専門分野を超えています。私は常にcoredataを使用してモデルを管理しており、ギリシャ語/ロシア語の文字列を何度も使用しており、そのような問題は発生していません。誰かがこれを拡張して光を当てることができれば、私もこの主題に非常に興味があります。

于 2013-02-25T09:26:35.207 に答える