2015-10-02 3 views
7

プライム記号付きの文字列を使用しようとしていますが、String.StartsWithメソッドで問題が発生しています。次のコードが例外を投げる理由は何ですか?String.StartsWith次の文字がプライムシンボル(char)のときには動作しません。697

string text_1 = @"123456"; 
string text_2 = @"ʹABCDEF"; 

string fullText = text_1 + text_2; 
if (!fullText.StartsWith(text_1)) 
{ 
    throw new Exception("Unexplained bad error."); 
} 

私は、このプライム記号(文字)697がアクセントとして扱われているので、それの前の文字を変えているので、問題があると思われます。 (私はそれがあるべきではないと思う - それはthe prime symbolでなければならないので、その前の数字の数字を変更すべきではない)。私はこれをテストする方法については正確にはわかりません。私はthis answerで提案した方法を試してみましたが、それはfalseを返さ:任意の助け

IsLetterWithDiacritics(text_1[5]) // == False 
IsLetterWithDiacritics(fullText[5]) // == False 
IsLetterWithDiacritics(fullText[6]) // == False 

感謝。 MSDNから

+1

'InvariantCulture'または' Ordinal'を使うように言って、 'StringComparison'型のオーバーロードを使ってみましたか? –

+1

@BradleyUffnerこれは動作しませんが、 'fullText.StartsWith(text_1、StringComparison.Ordinal)'が動作します。 – DavidG

答えて

3

ʹまたはMODIFIER LETTER PRIMEは間隔修飾子文字です。これは真の文字ではなく、前の文字を変更する特殊な使用記号です。

From MSDN

修飾文字は結合文字のように、先行文字の修飾を示し、自立間隔文字です。


string.StartsWithので、あなたの連結文字列にfalseを返すされ、は、実際には、それの後に追加されプライム記号によって変更されます。

+0

ありがとう、私はリンク先のWikiページの最後にも気がつきました。私は間違ったプライムシンボルを使用していることを認識しました。修飾子文字プライムではなく、(char)8242を使用するべきです。明確化のためにありがとう。 – Ben

2

あなたは、このようなString.Compare、String.Equals、またはString.IndexOfとして文字列比較メソッドを呼び出し

、あなたは常にそのように型StringComparisonのパラメータを含んでオーバーロードを呼び出す必要がありますメソッドが実行する比較のタイプを指定できます。詳細については、.NET Frameworkで文字列を使用するためのベストプラクティスを参照してください。

言語以外の比較を行う場合は、StringComparison.Ordinalを使用する必要があります。以下のコードは例外をスローしません。

string text_1 = @"123456"; 
string text_2 = @"ʹABCDEF"; 

string fullText = text_1 + text_2; 
if (!fullText.StartsWith(text_1, StringComparison.Ordinal)) 
{ 
    throw new Exception("Unexplained bad error."); 
} 
関連する問題