7

を使用IndexOfして大きな値の char が続く char (たとえば、char 700 は ') を検索すると、IndexOfは探している char を認識できません。

例えば

string find = "abcʼabcabc";   
int index = find.IndexOf("c");

このコードでは、index は 2 である必要がありますが、6 が返されます。

これを回避する方法はありますか?

4

2 に答える 2

14

Unicode 文字 700 は修飾アポストロフィです。つまり、文字 c を修飾します。同様に、'e' の後に文字 769 (0x301)を使用すると、実際には 'e' ではなくなります。e は鋭アクセント付きの e に変更されています。ウィット:é。この文字が実際には 2 文字であることがわかります。それをメモ帳にコピーして、バックスペース キーを押してください (いいですね)。

言語比較なしで「序数」比較 (バイトごと) を行う必要があります。これにより、「c」が検出され、次の文字によって変更されるという言語学的事実が無視されます。私の「e」の例では、バイトは (65)(769) であるため、65 をバイト単位で検索すると、それが見つかります。(65)(769) が言語的に(233) と同じ: é。(233) を言語的に検索すると、「同等の」(65)(769) が見つかります。

string find = "abéabcabc";
int index = find.IndexOf("é"); //gives you '2' even though the "find" has two characters and the the "indexof" is one

あまり混乱しないことを願っています。実際のコードでこれを行っている場合は、何をしているのかをコメントで正確に説明する必要があります。私の 'e' の例のように、一般的に、ユーザー データに対してはセマンティックな等価性を、定数などに対しては序数の等価性を求めます (うまくいけば、そうなるでしょう)。あなたの後継者が斧であなたを追い詰めないように、このように違いはありません)。

于 2013-10-21T13:56:13.317 に答える
7

コンストラクトは、単純なバイトとは言語的に異なるものとして処理されています。序数文字列比較を使用して、バイト比較を強制します。

        string find = "abcʼabcabc";

        int index = find.IndexOf("c", StringComparison.Ordinal);
于 2013-10-21T13:53:52.550 に答える