时间:2019-04-24 07:14:24

标签: c# asp.net .net string

是否存在.net 错误,导致以下代码将S大写,从而使"Ben’S Pies"变成大写字母?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Globalization;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
        string value = "ben’s pies";
        string titleCase = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(value);
        Console.WriteLine(titleCase);    
        }
    }
}

您可以在https://rextester.com/(我尝试过的地方)上看到输出。

2 个答案:

答案 0 :(得分:7)

如果打印value的转储:

  string value = "ben’s pies";

  Console.Write(string.Join(" ", value.Select(c => ((int)c).ToString("x4"))));

你会得到

  

0062 0065 006e 2019 0073 0020 0070 0069 0065 0073

现在,让我们看看 Unicode U + 2019

https://www.fileformat.info/info/unicode/char/2019/index.htm

我们看到不是撇号,而是“右单报价标记(U + 2019)”。这就是ToTitleCase正常工作的原因(它在标点符号之后用大写字母-引号引起来)。要修改您的示例,请用撇号代替引号:

 string value = "ben's pies";

 // Ben's Pies
 string titleCase = CultureInfo.GetCultureInfo("en-US").TextInfo.ToTitleCase(value);

答案 1 :(得分:1)

ToTitleCase确实确实似乎将正确的单引号视为转换为标题大小写的单词之间的分隔符。 The documentation说:

  

ToTitleCase方法提供了任意的大小写行为,该行为不一定在语言上是正确的。语言正确的解决方案将需要其他规则,并且当前算法稍微更简单,更快速。我们保留将来使该API变慢的权利。