【问题标题】:Strange results from IndexOf on German string德语字符串上 IndexOf 的奇怪结果
【发布时间】:2012-02-13 12:40:24
【问题描述】:

我有字符串“Ärger,-Ökonom-i-Übermut-ẞ-ß”,当我运行 IndexOf("--") 时,我得到 23 的结果。如果我在同一字符串上使用 Replace,则不会被替换.

我不明白发生了什么,所以有人可以解释一下这个问题吗?应用程序文化设置为克罗地亚语,不是德语,框架版本为 3.5。

将文化更改为德语 (de-DE) 并不会改变这种奇怪的行为。

这是调试器的截图:

【问题讨论】:

  • String中没有“--”对吗?
  • 对我来说听起来像是一个错误。我可以用 .Net 3.5 重现该问题,但它在 .Net 4.0 中返回 -1。
  • 恐怕 U+1E9E 根据 .NET 3.5 是未定义的,因为在 Unicode 4.0(或任何版本的 Unicode .NET 3.5 使用)中不存在此字符。这是一个相当新的添加(德语 ß 的大写版本)。所以 IndexOf 函数会忽略它。如果您对文本有任何控制权,则可以将字符更改为 ß 或 SS,无论哪个更合适。当然更好的解决方案是将.NET升级到v4.0!
  • @Mr Lister,好的,所以也许这不是错误。我想这取决于一个角度:) 请写下答案,以便我接受。
  • 好吧,我真的认为您的评论澄清了这个问题,重要的是 U+1E9E 在 .NET 3.5 中未定义

标签: c# .net cultureinfo indexof


【解决方案1】:

由于李斯特先生不想要他当之无愧的赞成票,我将他的评论粘贴在这里,并接受答案。

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

【讨论】:

    【解决方案2】:

    IndexOf 使用当前文化,如果您不另外说明:

    此方法执行一个单词(区分大小写和区域性) 使用当前文化进行搜索。

    Replace 使用序数比较:

    此方法执行一个序数(区分大小写和 文化不敏感)搜索找到oldValue

    【讨论】:

    • .NET 3.5 和 .NET 4.0 在这方面有什么变化吗?因为代码在 .NET 4.0 中按预期工作。
    • @Darin:不确定——只要我记得,这种行为就已经被记录在案了。我现在正在做一些测试,但我也无法在 .NET4 中复制 OP 的结果。
    • 是的,但是在 .NET 3.5 中可以重现该行为。
    • 字符串函数没有变化,但是字符分类表更新了,所以现在定义了U+1E9E。
    • @Mr Lister:我想你已经一针见血了。为什么不将其作为答案,以便我们为您投票?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2019-10-26
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多