C# 如何忽略String.ToUpper()中的撇号?
在法语中,许多城市的名字中都有撇号。比如“英国街” 我们使用一个转换器在几乎每个UI部分都用大写字母写 但是string.ToUpper似乎有一个bug,因为我们得到的是“RUE DE L’église”,而不是我们应该得到的“RUE DE L’église” 你能解释一下原因吗?为了得到预期的结果 我的转换器看起来像这样C# 如何忽略String.ToUpper()中的撇号?,c#,.net,C#,.net,在法语中,许多城市的名字中都有撇号。比如“英国街” 我们使用一个转换器在几乎每个UI部分都用大写字母写 但是string.ToUpper似乎有一个bug,因为我们得到的是“RUE DE L’église”,而不是我们应该得到的“RUE DE L’église” 你能解释一下原因吗?为了得到预期的结果 我的转换器看起来像这样 public object Convert(object value, Type targetType, object parameter, CultureInfo
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;
}
问题可能在您的“当前文化”或“ToTitleCase”中
告诉我您的“CultureInfo”标识符(
System.Globalization.CultureInfo.CurrentCulture.ToString()
),这样我就可以进行更多的调查。您可能遇到了一个没有考虑的情况,或者行为是“正确的”
各国的文件:
将指定的字符串转换为标题大小写(,但完全大写的单词除外,它们被视为首字母缩略词)
(我的重点)
该代码可能不考虑非字母字符,因此撇号的存在使得这个词不是大写字母,因此在第一个字母之后转换为小写。< /P> 问题是,这种行为是否正确?撇号的出现意味着这不是首字母缩略词,因此它不应该遵循所有大写词(首字母缩略词)都遵循的规则。非首字母缩略词的正确行为是第一个字母大写,其余字母小写(无论其当前状态如何)
尽管如此,在同一页上还有其他文档: 如上所述,ToTitleCase方法提供了一种任意的套管行为,这种行为在语言上不一定正确。语言正确的解决方案需要额外的规则,而当前的算法更简单、更快。我们保留在将来降低此API速度的权利 这意味着他们实际上已经证明,它不一定能完全满足人们的需求,只是提供了一种足够好(tm)的方法来解决问题 鉴于所有这些,我想说该方法的行为与文档中描述的完全一样。ToTitleCase()
不符合您的要求。它将每个单词的第一个字符大写。您需要的只是普通的string.ToUpper()
:
输出:
RUE DE L'ÉGLISE
ToTitleCase()
:
输出
Rue De L'église
将
ToTitleCase()
和ToUpper()
组合在一起会导致您描述的这种奇怪的行为,因为ToTitleCase()
尝试将除第一个字符以外的每一个字符都小写(除了那些全是大写字母的单词和根据的缩写词)我在VB中尝试过,我也有同样的“问题”
这个问题与ToTitleCase()函数有关,因为ToUpper()函数工作得很好
我试着在“英语”后面加上“chrétien”
res
变量包含“国王街”
你可以看到“église”的“é”没有被转换,但“chrétien”的“é”已经被转换成大写
s
变量包含“RUE DE LÉGLISE CHRÉTIENNE”
如果我将“église”替换为“eglise”(无重音字符),res
变量包含“RUE DE L'eglise CHRÉTIENNE”
我们可以看到“é”字符对转换没有影响
我的区域设置是FR-FR
我认为这是一个错误,因为微软没有正确地尊重法语,简单的引用是语言的一部分
在等待Microsoft解决方案时,您可以实施以下变通方法:
Dim res
= CultureInfo
.CurrentCulture
.TextInfo
.ToTitleCase(s.replace("'","--"))
.replace("--","'")
事实上,如果要在TitleCase中转换,则必须删除对大写的转换
正确的代码应该是
Dim s = "Rue de l--église chrétienne de l--hiver"
Dim res = CultureInfo.CurrentCulture.TextInfo
.ToTitleCase(s.Replace("'", "--")).Replace("--", "'")
而
res
varaible包含“Hiver国王街” 我的文化是fr FRIt似乎是导致这种行为的ToTitleCase如果你想要所有的caps,那么就不要使用ToTitleCase()。
Dim s = "Rue de l'église chrétienne".ToUpper()
Dim res = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s)
Dim res
= CultureInfo
.CurrentCulture
.TextInfo
.ToTitleCase(s.replace("'","--"))
.replace("--","'")
Dim s = "Rue de l--église chrétienne de l--hiver"
Dim res = CultureInfo.CurrentCulture.TextInfo
.ToTitleCase(s.Replace("'", "--")).Replace("--", "'")