字符串比较,.NET和非中断空间

时间:2009-03-31 14:53:21

标签: c# string character-encoding

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

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

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

5 个答案:

答案 0 :(得分:34)

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

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

希望这有帮助,Dan

答案 1 :(得分:9)

如果是我的话,我会把弦“正常化”,因为我把它们拉进去了;可能有一个string.Replace()。那么你不需要在其他任何地方改变你的比较。

编辑:马克,这是一个艰难的。对于你或你的客户来说,它取决于什么是“标准化”字符串。我一直处于类似的情况,客户要求字符串如下:

I have 4 apples.
I have four apples.

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

答案 2 :(得分:2)

需要

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

其中\u00A0是非破坏空间

这将用正常空间替换非破坏空间。

答案 3 :(得分:1)

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

答案 4 :(得分:-1)

同样没有正则表达式,主要是为了我自己以后需要的时候:

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