Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何忽略String.ToUpper()中的撇号?_C#_.net - Fatal编程技术网

C# 如何忽略String.ToUpper()中的撇号?

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

在法语中,许多城市的名字中都有撇号。比如“英国街”

我们使用一个转换器在几乎每个UI部分都用大写字母写

但是string.ToUpper似乎有一个bug,因为我们得到的是“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;
    }

问题可能在您的“当前文化”或“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("--", "'")