此问题适用于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和新板)。
两种设备:
新设备预安装了CF 3.5,其GAC文件我通过实验重命名,所描述的行为没有变化。由于在运行时总是报告版本2.0.7045.0,我假设这些程序集没有效果。
虽然这并不难解决,但是当事情看起来很神奇时我无法忍受。什么提示我缺少什么?
编辑:它越来越陌生,看到截图:
还有一个:
答案 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。
一个疯狂的猜测,我知道:)