德语字符串的IndexOf方法返回奇怪的结果

9
我有一个字符串"Ärger,-Ökonom-i-Übermut-ẞ-ß",当我运行IndexOf("--")时,结果为23。如果我在同一字符串上使用Replace,就没有任何替换发生。
我不明白发生了什么,所以能否有人解释一下这个问题?应用程序的文化设置为克罗地亚语,而不是德语,框架版本为3.5。
将文化设置更改为德语(de-DE)也无法改变这种奇怪的行为。
下面是调试器的截图:

2
字符串中没有"--"是正确的吗? - Volker Mauel
2
对我来说听起来像是一个 bug。我可以在 .Net 3.5 中重现这个问题,但在 .Net 4.0 中按预期返回 -1。 - ken2k
11
很抱歉,根据.NET 3.5的规定,U+1E9E是未定义的,因为这个字符在Unicode 4.0(或.NET 3.5使用的任何版本的Unicode)中不存在。这是一个相当新的加入(德语ß的大写形式)。所以IndexOf函数会忽略它。如果您能够控制文本,可以将该字符更改为ß或SS,具体取决于哪个更合适。当然,更好的解决方案是升级.NET到v4.0! - Mr Lister
1
@Mr Lister,好的,也许这不是一个错误。我想这取决于不同的观点 :) 请写下答案,以便我可以接受它。 - Antonio Bakula
1
@MrLister,我认为楼主是正确的,您应该将您的评论写成答案,这样楼主就可以接受它了。 - ken2k
显示剩余8条评论
2个回答

3

由于Lister先生不想要他应得的赞,我会在这里粘贴他的评论并接受答案。

很抱歉,根据.NET 3.5,U+1E9E未定义,因为此字符不存在于Unicode 4.0(或.NET 3.5使用的任何Unicode版本)中。这是一个相当新的添加(德语ß的大写版本)。因此IndexOf函数会忽略它。如果您可以控制文本,则可以将字符更改为ß或SS,具体取决于哪个更合适。当然,更好的解决方案是升级.NET到v4.0!


2
IndexOf 如果没有特别说明,将使用当前区域设置:

此方法使用当前区域设置执行单词(区分大小写和区域性)搜索。

Replace 使用序数比较:

此方法使用序数(区分大小写且与区域性无关)搜索以查找 oldValue


2
在.NET 3.5和.NET 4.0之间,在这方面有什么变化吗?因为代码在.NET 4.0中按预期工作。 - Darin Dimitrov
@Darin:不确定-这种行为已经被记录了很长时间。我现在正在进行一些测试,但是我在.NET4中也无法复制OP的结果。 - LukeH
3
字符串函数没有变化,但字符分类表已更新,因此现在定义了U+1E9E。 - Mr Lister
@MrLister,非常有趣。肯定会导致一些非常微妙的错误。 - Darin Dimitrov
1
@Mr Lister:我认为你说得很对。为什么不把它变成一个答案,这样我们就可以给你点赞了呢? - LukeH
显示剩余3条评论

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