【问题标题】:String Comparison, .NET and non breaking space字符串比较、.NET 和非中断空间
【发布时间】:2010-10-16 15:03:10
【问题描述】:

我有一个用 C# 编写的应用程序,它可以进行大量的字符串比较。这些字符串是从各种来源(包括用户输入)中提取出来的,然后进行比较。但是,在将空间“32”与非破坏空间“160”进行比较时,我遇到了问题。对于用户来说,它们看起来相同,因此他们期望匹配。但是当应用程序进行比较时,没有匹配项。

解决此问题的最佳方法是什么?我是否必须去执行字符串比较并手动将不间断空格标准化为空格的所有代码部分? .NET 是否提供任何帮助? (我已经尝试了所有比较选项,但似乎没有任何帮助。)

有人建议我在收到时对字符串进行规范化,然后让字符串比较方法简单地比较规范化的字符串。我不确定这样做是否直接,因为首先什么是标准化字符串。我也要把它标准化什么?当然,现在我可以将非中断空间转换为中断空间。但是还能出现什么?这些规则可能有很多吗?他们甚至可能会发生冲突。 (在一种情况下我想使用规则,而在另一种情况下我不想。)

【问题讨论】:

  • 您可以编辑自己的问题以添加更多信息或提供说明。

标签: c# string character-encoding


【解决方案1】:

没有正则表达式也一样,主要是我以后需要的时候:

text.Replace('\u00A0', ' ')

【讨论】:

  • 你给的表达式顺序错误应该是 text.Replace('\u00A0',' ')
  • @Gaurravs 确实如此。我需要另一个方向,因此犯了错误。
【解决方案2】:

应该是

text.Replace('\u00A0',' ')

\u00A0 是非中断空间

这将用普通空间替换非中断空间。

【讨论】:

  • 这行得通,节省了正则表达式的使用。尽管性能差异可能可以忽略不计。
【解决方案3】:

我建议创建您自己的字符串比较器来扩展原始比较器之一——在那里进行“规范化”(用常规空格替换不间断空格)。除了实例 Equals 方法外,还有一个静态 String.Equals 接受比较器。

【讨论】:

    【解决方案4】:

    我经历了很多痛苦才找到这个简单的答案。下面的代码使用正则表达式将非中断空格替换为普通空格。

    string cellText = "String with non breaking spaces.";
    cellText = Regex.Replace(cellText, @"\u00A0", " ");
    

    希望这会有所帮助,丹

    【讨论】:

    • @ 不是停止转义字符的工作吗?不应该是 cellText.Replace("\u00A0", " ")?
    • @jpmcclung 是的。请参阅msdn.microsoft.com/en-us/library/system.string.aspx 中的“Char 对象和 Unicode 字符”。 FWIW,cellText.Replace('\u00A0', ' ') 甚至更快 (dotnetperls.com/replace-performance)
    • 仅供参考 - cellText.Replace(@"\u00A0", " ") 不起作用。 Regex.Replace(cellText, @"\u00A0", "");似乎是要走的路。
    • @DavidSchmitt 这对我不起作用(vb.net)-但 Regex.Replace 做到了。
    • @ 确实会停止转义,但 String.Regex 会在运行时处理转义,而 String.Replace 不会。 3 件有效的事情:(1) Regex.Replace(cellText, @"\u00A0", " ") (2) Regex.Replace(cellText, "\u00A0", " ") (3) cellText.Replace('\u00A0 ', ' ') 不起作用:cellText.Replace(@"\u00A0", " ");
    【解决方案5】:

    如果是我,我会在“拉入”时“标准化”字符串;可能带有 string.Replace()。这样您就无需在其他任何地方更改比较。

    编辑:马克,这很难。至于什么是“规范化”字符串,这完全取决于您或您的客户。我遇到过类似的情况,客户要求这样的字符串:

    我有 4 个苹果。 我有四个苹果。

    实际上是相等的。对于不同的情况,您可能需要单独的规范器。无论哪种方式,我仍然会在检索原始字符串时进行规范化。

    【讨论】:

    • 是的,我会使用您自己的调用 string.Replace 的函数将字符串标准化为您关心的内容,然后进行比较。
    • 伙计们,我如何针对这个提议的答案发布后续问题或澄清问题?我在这里做吗?这只允许 255 个字符
    • @Mark:编辑您的问题以包括跟进或澄清。
    • 哈哈,谢谢 - 示例比较(4 == 四)让我发笑,但也让我思考“相等”的定义应该意味着什么。也许我们需要一个 string.Equivalent() 方法。
    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多