18

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

我在 .net DLL 中遇到了一个错误,该错误多年来一直在非常不同的 CE 设备上使用,但没有显示任何问题。突然,在新的 Windows CE 5.0 设备上,这个 bug 出现在以下代码中:

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

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

由于使用时不会发生此行为

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

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

两种设备:

  • 运行具有相同本地化的 Windows CE 5.0
  • System.Environment.Version 报告“2.0.7045.0”
  • CultureInfo.CurrentUICulture 和 CultureInfo.CurrentCulture 报告“en-GB”(也使用“de-DE”进行测试)
  • “所有”相关的注册表项都是相等的。

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

虽然这并不难解决,但当事情看起来如此神奇时,我无法忍受。任何提示我错过了什么?

编辑:越来越陌生,见截图: 截屏

多一个: 截屏

4

3 回答 3

4

我相信您已经使用序数搜索得到了答案

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

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

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

于 2013-06-28T13:06:23.090 回答
0

http://msdn.microsoft.com/en-us/library/k8b1470s.aspx上的参考资料指出:

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

这是来自 4.5 参考,以前版本的参考不包含类似的内容。

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

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

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

于 2013-06-28T13:16:48.043 回答
0

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

int i = s.IndexOf("  ", StringComparison.InvariantCulture);
于 2013-06-28T11:29:20.390 回答