如何在String.ToUpper()中忽略撇号?

时间:2018-04-25 09:51:41

标签: c# .net

在法国很多城市都有他们名下的撇号。比如“rue de l'église”

我们几乎在每个UI部件中使用转换器将其写入Full UpperCase。

但是string.ToUpper似乎有一个错误,因为我们得到的是“RUE DE L'église”,而不是我们应该得到的“RUE DE L'ÉGLISE”。

你能解释一下原因吗?无论如何要获得预期的结果?

我的转换器看起来像这样

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            var res = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(value.ToString().ToUpper());
            return res;
        }

        return String.Empty;
    }

4 个答案:

答案 0 :(得分:4)

你可能会遇到一个没有考虑过的角落,或者行为是"正确的#34;。

TextInfo.ToTitleCase州的文件:

  

将指定的字符串转换为标题大小写(除了完全以大写字母表示的单词,这被认为是首字母缩略词)。

(我的重点)

代码可能不会考虑非字母字符,因此撇号的存在使得这个单词不是全部大写,因此第一个字母后面的字母会转换为小写字母。

问题是,这种行为不正确吗?撇号的存在意味着这不是首字母缩略词,因此不应该遵循全大写单词(首字母缩略词)遵循的规则。非首字母缩写词的正确行为是第一个字母变为大写,其余为小写(无论其当前状态如何)。

无论如何,在同一页面上还有其他文档:

  

如上所述,ToTitleCase方法提供了一种任意的套管行为,这种行为在语言上并不一定正确。语言上正确的解决方案需要额外的规则,并且当前算法更简单,更快速。我们保留在未来降低此API速度的权利。

这意味着他们实际上已经证明它并不一定能完全按照人们的意愿行事,只能为问题提供足够好的(tm)方法。

鉴于这一切,我说这种方法的行为完全符合记录。

答案 1 :(得分:4)

ToTitleCase()没有做你想做的事。它将每个单词的第一个字符大写。你想要的只是简单string.ToUpper()

Console.WriteLine("rue de l'église".ToUpper());

输出:

RUE DE L'ÉGLISE

ToTitleCase()

Console.WriteLine(CultureInfo.GetCultureInfo("fr-fr").TextInfo.ToTitleCase("rue de l'église"));

输出

Rue De L'église

组合ToTitleCase()ToUpper()会导致您描述的这种奇怪的行为,因为ToTitleCase()尝试将每个其他字符小写为低于第一个字符(除了全部大写且被视为首字母缩略词的字词外,根据{{​​3}})

答案 2 :(得分:2)

可能是您的“CurrentCulture”或“ToTitleCase”中的问题?

告诉我你的“CultureInfo”标识符(System.Globalization.CultureInfo.CurrentCulture.ToString()),所以我可以调查一下。

答案 3 :(得分:1)

我在VB中尝试过,我遇到了同样的“问题”。

问题与ToTitleCase()函数有关,因为ToUpper()函数运行良好。

我试过在“église”之后添加“chrétien”

Dim s = "Rue de l'église chrétienne".ToUpper()
Dim res = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s)

res变量包含“RUE DE L'égliseCHRÉTIENNE”

您可以看到“église”的'é'尚未转换,但“chrétien”的'é'已被转换为大写字母!

s变量包含“RUE DE L'ÉGLISECHRÉTIENNE”

如果我用“eglise”替换“église”(没有重音字符),res变量包含“RUE DE L'egliseCHRÉTIENNE”

我们可以看到'é'字符对转换没有影响。

我的区域设置是FR-FR。

我认为这是一个错误,因为微软不尊重正确的法语,其中简单引用是语言的一部分。

在等待Microsoft解决方案时,您可以实施以下解决方法:

Dim res
    = CultureInfo
        .CurrentCulture
            .TextInfo
                .ToTitleCase(s.replace("'","--"))
                    .replace("--","'")

事实上,如果您要在TitleCase中进行转换,则必须删除转换为UpperCase。

正确的代码是

Dim s = "Rue de l--église chrétienne de l--hiver"
Dim res = CultureInfo.CurrentCulture.TextInfo
  .ToTitleCase(s.Replace("'", "--")).Replace("--", "'")

res变形包含“Rue De L'ÉgliseChrétienneDeL'Hiver”!