ここで問題です
以下のコードを実行すると何が表示されるでしょうか?
static void Main(string[] args)
{
string s1 = "あゝ人生に涙あり";
string s2 = "あー夏休み";
Console.WriteLine(s1.IndexOf("ゝ"));
Console.WriteLine(s1.IndexOf("ー"));
Console.WriteLine(s1.IndexOf("ー"));
Console.WriteLine(s2.IndexOf("ゝ"));
Console.WriteLine(s2.IndexOf("ー"));
Console.WriteLine(s2.IndexOf("ー"));
}
正解はこちら
( ゚д゚)
どういうことなの
原因は IndexOf のデフォルトが CurrentCulture
だから
これだと 厳密さを要求しない比較 になる
同様のケースでは こんな事案 も
しかしまさかこんなものまで……
どうすればいいの
以下のように比較方法を Ordinal
(=単純なバイト比較)にしてやればいい
static void Main(string[] args)
{
string s1 = "あゝ人生に涙あり";
string s2 = "あー夏休み";
Console.WriteLine(s1.IndexOf("ゝ", StringComparison.Ordinal));
Console.WriteLine(s1.IndexOf("ー", StringComparison.Ordinal));
Console.WriteLine(s1.IndexOf("ー", StringComparison.Ordinal));
Console.WriteLine(s2.IndexOf("ゝ", StringComparison.Ordinal));
Console.WriteLine(s2.IndexOf("ー", StringComparison.Ordinal));
Console.WriteLine(s2.IndexOf("ー", StringComparison.Ordinal));
}
この実行結果がこちら
もう Ordinal
がデフォルトでいいんじゃないかな……?
結論
(追記)ブルータスお前もか
他にも長音符とみなされるものがありそうな雰囲気だったので調べてみました
static void Main(string[] args)
{
string s1 = "あー夏休み";
Console.WriteLine("ゝ:" + s1.IndexOf("ゝ"));
Console.WriteLine("ー:" + s1.IndexOf("ー"));
Console.WriteLine("ー :" + s1.IndexOf("ー"));
Console.WriteLine("~:" + s1.IndexOf("~"));
Console.WriteLine("~ :" + s1.IndexOf("~"));
Console.WriteLine("々:" + s1.IndexOf("々"));
Console.WriteLine("ゞ:" + s1.IndexOf("ゞ"));
Console.WriteLine("ヽ:" + s1.IndexOf("ヽ"));
Console.WriteLine("ヾ:" + s1.IndexOf("ヾ"));
Console.WriteLine("- :" + s1.IndexOf("-"));
Console.WriteLine("-:" + s1.IndexOf("-"));
Console.WriteLine("―:" + s1.IndexOf("―"));
Console.WriteLine("‐:" + s1.IndexOf("‐"));
Console.WriteLine("= :" + s1.IndexOf("="));
Console.WriteLine("=:" + s1.IndexOf("="));
Console.WriteLine("_:" + s1.IndexOf("_"));
Console.WriteLine("_ :" + s1.IndexOf("_"));
}
この結果がこちら
( ゚д゚)
( ゚д゚ )
どうやら 々
、ゞ
、ヽ
、ヾ
、―
が長音符とみなされるようです
探せばもっとあるかも……