間違い探しクイズのような感じですが、この二つの「が」は厳密には違います。
「が」 – U+304C
「が」 – U+304B U+3099
と、異なる文字で記述しています。見た目は(フォントなどによりますが)一緒です。話がややこしくなるので、1文字の方を「が」、2文字の方を「が」とします。
(U+3099 は、”Combining Katakana-Hiragana Voiced Sound Mark” という名前がついています。結合文字用の濁点です。)
なお、手元の環境 (Win7 + ATOK) で「が」を入力すると1文字の方の「が」でした。
ということは、String.Length をとると…
「が」 = 1
「が」 = 2
となります。さらに、これらを入れたStringを比較すると…
Dim strOne As String = "が" '---一文字の方です Dim strTwo As String = "が" '---二文字の方です MsgBox(strOne = strTwo) '---FALSE が表示される
となります。確かにString オブジェクトの中身という観点では正しい挙動なのですが、見た目が同じなのでかなりややこしい問題の元になりそうです。
これをこうしてみます。
Thread.CurrentThread.CurrentCulture = New Globalization.CultureInfo("ja-JP")
MsgBox(String.Equals(strOne, strTwo)) '---FALSEが返却されます
MsgBox(String.Equals(strOne, strTwo, StringComparison.CurrentCulture)) '---TRUEが返却されます
後者のコードは、明示的に”ja-JP”カルチャーで比較するようにしたものです。
このあたりについては、MSDN : .NET Framework で文字列を使用するためのベスト プラクティス に詳しいのですが、やたらと話が入り組んでいてわかりにくいのが難点です。