为什么IndexOf在匈牙利文化中无法找到字符N与Y的组合?

20

IndexOf 函数应用于字符串时返回 -1,但是确实存在匹配项。

string sUpperName = "PROGRAMOZÁSI NYELVEK II. ADA EA+GY. (BSC 08 A)";
string sUpperSearchValue = "N";

sUpperName.IndexOf(sUpperSearchValue); // Returns -1

sUpperSearchValue = "NY";
sUpperName.IndexOf(sUpperSearchValue); // Returns 13

sUpperName[13]; // 78 'N'
sUpperSearchValue[0]; // 78 'N'
sUpperName[13] == sUpperSearchValue[0]; // true

你知道为什么它能找到"NY"但是无法单独找到"N"吗?如果我搜索字符串中的其他字母,它可以找到它们,但不能找到"N"。同样的问题也会出现在小写情况下。

如果我输入" N"也无法匹配,在" NY"时可以匹配成功。

控制台中的截图here


1
这两个都会打印出13。你确定这是你自己使用的代码吗?你能将NY中的N复制到sUpperSearchValue中吗?(实际上是ctrl+c,ctrl+v)。 - Jeroen Vannevel
1
也许在某些情况下,N 是来自拉丁字母表,而在另一种情况下则来自匈牙利(这只是猜测)。如果是这种情况,它们是不同的字符,并且可以解释这种行为。 - Tasos K.
但是这能解释为什么只有其中一个字母会出现这个问题,而其他字母却不会吗? - Dark
1个回答

22

在匈牙利的.NET文化中,“ny”这个字母组合代表一个独立的字母,因此在你的示例中没有“N”,只有“NY”。


4
将我的语言设置更改为HU-hu确实允许我重现该问题;之前正常运行的代码现在会返回-1,用NY分开放置在匈牙利也可以解决这个问题;这是否意味着NY永远不能一起放置而不是使用Ny来代替单独的NY - Jeroen Vannevel
6
是的,那是不同的字母,两者都可用。虽然在这种情况下它的启发式是正确的,但这个字母组合是“ny”(在“nyelvek”中),而不是两个字母。 - Gábor Bakos
好的,那很有道理。谢谢您的快速回复。 - Dark
1
@JeroenVannevel 我不确定,在匈牙利语中这些很少出现相邻但不表示单个字母的情况,但您始终可以使用不变的文化(http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.invariantculture(v=vs.110).aspx)。 - Gábor Bakos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接