比较法语字符 Î 的问题

Posted

技术标签:

【中文标题】比较法语字符 Î 的问题【英文标题】:Problem comparing French character Î 【发布时间】:2010-05-20 17:24:28 【问题描述】:

在比较“Île”和“Ile”时,C# 不认为它们是相同的。

    string.Equals("Île", "Ile", StringComparison.InvariantCultureIgnoreCase)

对于我遇到的所有其他重音字符,比较效果很好。

我应该使用另一个比较函数吗?

【问题讨论】:

【参考方案1】:

您指定使用不变区域性的比较规则来比较字符串。显然,在不变的文化中,这两个字符串不被认为是相等的。

您可以使用 String.Compare 以特定于文化的方式比较它们,并提供您想要比较字符串的文化:

if(String.Compare("Île", "Ile", new CultureInfo("fr-FR"), CompareOptions.None)==0)

请注意,在法国文化中,这些字符串也被认为是不同的。我包含了一个示例来说明,定义排序规则的是文化。您可能能够找到适合您要求的文化,或者使用所需的比较规则构建自定义文化,但这可能不是您想要的。

对于规范化字符串以便没有重音符号的一个很好的例子,have a look at this question。规范化字符串后,您将能够比较它们并认为它们相等。这可能是实现您的要求的最简单方法。

编辑

在 InvariantCulture 中不只是 i 字符有这种行为,这条语句也返回 false:

String.Equals("Ilê", "Ile", StringComparison.InvariantCultureIgnoreCase)

框架做了正确的事 - 这些字符实际上在大多数文化中是不同的(具有不同的含义),因此不应将它们视为相同。

【讨论】:

即使这样有效,我也觉得奇怪的是这个问题是特定于那个角色的。 @Bryan: Î 是 U+00CE,I 是 U+0049,它们完全不同。

以上是关于比较法语字符 Î 的问题的主要内容,如果未能解决你的问题,请参考以下文章

utf-8 邮件 php 希腊字符

如何恢复西里尔短语“Âñòîðîíó Äîæäÿ”的正确字符编码?

如何允许用户在 UITextField 中输入法文字符? [关闭]

MySQL utf-8 问题与 json

Junit 在法语字符串断言上失败

用于输入验证的正则表达式白名单 - 不区分重音