C#string.IndexOf()返回意外值

时间:2013-06-28 11:22:34

标签: c# string indexof

此问题适用于C#,. net Compact Framework 2和Windows CE 5设备。

我在.net DLL中遇到了一个错误,该错误在很多年的CE设备上使用多年,没有出现任何问题。突然,在新的Windows CE 5.0设备上,此错误出现在以下代码中:

string s = "Print revenue receipt"; // has only single space chars 
int i = s.IndexOf("  "); // two space chars

我希望我成为-1,但是直到今天,当indexOf突然返回5时,这才真实。

因为使用

时不会发生此行为
int i = s.IndexOf("  ", StringComparison.Ordinal);

,我很确定这是一种基于文化的现象,但我无法认识到这种新设备的不同之处。它是已知设备的大致相同版本(只是更快的CPU和新板)。

两种设备:

  • 以相同的本地化运行Windows CE 5.0
  • System.Environment.Version报告'2.0.7045.0'
  • CultureInfo.CurrentUICulture and CultureInfo.CurrentCulture report'en-GB'(也使用'de-DE'测试)
  • '所有'相关的注册表键是相等的。

新设备预安装了CF 3.5,其GAC文件我通过实验重命名,所描述的行为没有变化。由于在运行时总是报告版本2.0.7045.0,我假设这些程序集没有效果。

虽然这并不难解决,但是当事情看起来很神奇时我无法忍受。什么提示我缺少什么?

编辑:它越来越陌生,看到截图: screenshot

还有一个: screenshot

3 个答案:

答案 0 :(得分:4)

我相信你已经有了使用序数搜索的答案

    int i = s.IndexOf("  ", StringComparison.Ordinal);

您可以阅读String Class文档中的一小部分,其中有关于此主题的内容:

  

字符串搜索方法(如String.StartsWith和String.IndexOf)也可以执行区分文化或序数字符串比较。以下示例说明了使用IndexOf方法进行序数比较和文化敏感比较之间的差异。文化敏感搜索,其中当前文化是英语(美国)认为子字符串“oe”匹配连字“œ”。因为软连字符(U + 00AD)是零宽度字符,所以搜索将软连字符视为等效于空,并在字符串的开头找到匹配项。另一方面,序数搜索在任何一种情况下都找不到匹配。

答案 1 :(得分:0)

文化内容在某些系统上看起来确实非常神奇。经过多年的痛苦,我经常做的是总是手动将文化信息设置为InvariantCulture,我并不明确地希望不同文化的不同行为。所以我的建议是:让IndexOf检查始终使用相同的文化信息,如下所示:

int i = s.IndexOf("  ", StringComparison.InvariantCulture);

答案 2 :(得分:0)

http://msdn.microsoft.com/en-us/library/k8b1470s.aspx州的参考:

“字符集包括可忽略字符,这些字符是执行语言或文化敏感比较时不考虑的字符。在文化敏感搜索中,如果值包含可忽略字符,则结果等同于使用该字符进行搜索删除“。

这是4.5引用,以前版本的引用不包含这样的内容。

所以让我猜一下:他们已经将规则从4.0更改为4.5,现在两个空格序列的第二个空格被认为是“可忽略的字符” - 至少如果引擎将您的字符串识别为英文文本(比如在你的示例字符串中),否则不是。

不知何故,在你的新设备上,使用4.5 dll而不是预期的2.0 dll。

一个疯狂的猜测,我知道:)