是否存在.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/(我尝试过的地方)上看到输出。
答案 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变慢的权利。