を使用IndexOf
して大きな値の char が続く char (たとえば、char 700 は ') を検索すると、IndexOf
は探している char を認識できません。
例えば
string find = "abcʼabcabc";
int index = find.IndexOf("c");
このコードでは、index は 2 である必要がありますが、6 が返されます。
これを回避する方法はありますか?
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' の例のように、一般的に、ユーザー データに対してはセマンティックな等価性を、定数などに対しては序数の等価性を求めます (うまくいけば、そうなるでしょう)。あなたの後継者が斧であなたを追い詰めないように、このように違いはありません)。
コンストラクトは、cʼ
単純なバイトとは言語的に異なるものとして処理されています。序数文字列比較を使用して、バイト比較を強制します。
string find = "abcʼabcabc";
int index = find.IndexOf("c", StringComparison.Ordinal);