4

我显然在这里遗漏了一些东西..

我正在编写一个函数,它返回由特定字符串分隔的子字符串的数量。这是相当简单的功能 -

public static FuncError DCount(String v1, String v2, ref Int32 result) {
        result = 0;
        if (String.IsNullOrEmpty(v1)) {
            return null;
        }
        if (String.IsNullOrEmpty(v2)) {
            return null;
        }

        int ct = 1;
        int ix = 0;
        int nix = 0;

        do {
            nix = v1.IndexOf(v2, ix);
            if (nix >= 0) {
                ct++;

                System.Diagnostics.Debug.Print(
string.Format("{0} found at {1} count={2} result = {3}",
v2, nix, ct, v1.Substring(nix,1)));
                ix = nix + v2.Length;
            }
        } while (nix >= 0);
        result = ct;
        return null;
    }

当我使用在特定情况下用作分隔符的特殊字符进行调用时,问题就出现了。它返回了很多误报。从 Debug.Print 开始,第一个和最后一个参数应该始终相同。

þ found at 105 count=2 result = t
þ found at 136 count=3 result = t
þ found at 152 count=4 result = þ
þ found at 249 count=5 result = t
þ found at 265 count=6 result = t
þ found at 287 count=7 result = t
þ found at 317 count=8 result = t
þ found at 333 count=9 result = þ
þ found at 443 count=10 result = þ
þ found at 553 count=11 result = þ
þ found at 663 count=12 result = þ
þ found at 773 count=13 result = þ
þ found at 883 count=14 result = þ
þ found at 993 count=15 result = þ

如果我将 þ 作为字符传递,它可以正常工作。如果我使用 þ 作为分隔符拆分字符串,它将返回正确数量的元素。至于错误识别的't',结果中还有其他't'没有被拾取,所以不是字符转换问题。

使困惑 ...

谢谢

4

3 回答 3

6

这里的问题是不同的文化如何代表人物,在某些情况下如何将它们结合起来。

您正在搜索的字母Thorn显然可以用这些th字母表示。

在LINQPad中尝试此代码:

void Main()
{
    string x = "uma thurman";
    x.IndexOf("þ").Dump();
}

它将输出4.

(注意我在挪威的一台机器上运行这个程序,它可能对结果有影响,也可能没有影响)

在某些文化中,这与双 S - ß 的德语字母相同的“问题”可以在两个 s 一起出现的单词中找到。

于 2013-03-19T13:13:20.057 回答
3

您可以使用StringComparison.Ordinal获取与文化无关的字符串匹配。

使用 Lasse V. Karlsen 的例子

string x = "uma thurman";
x.IndexOf("þ", StringComparison.Ordinal).Dump();

将导致-1.

有关详细信息,请参阅在 .NET Framework 中使用字符串的最佳实践

于 2013-03-19T13:35:28.520 回答
0

您正在使用以下重载IndexOf

使用当前区域性执行单词(区分大小写和区域性)搜索

因此结果取决于CurrentCulture你的线程。大多数文化认为字母 thorn等同于th. 请参阅 Lasse 的回答。

例如,被称为Þórr 的古老北欧神通常用英语写作Thor,首字母在“Thursday”(Thor's day)中发音为“Th”。

要解决您的问题,请更改v1.IndexOf(v2, ix)为:

v1.IndexOf(v2, ix, StringComparison.Ordinal)

请参阅有关该重载的文档

序数比较char以一种幼稚的方式逐一比较值,只是比较它们的数值。相比之下,文化相关的比较做了很多标准化,无论是关于重音字母的不同表示,还是关于文化认为等效的不同字母。这在排序规则中也非常重要,例如对于序数比较,字符串在排序中位于字符串之后"naïve"(因为该值的数值高于)。"nasty"System.Char'ï''s'

于 2013-03-19T13:40:29.670 回答