【问题标题】:Title case capitalising letter after ‘'后的标题大写字母
【发布时间】:2019-04-24 07:14:23
【问题描述】:

是否存在 .net bug 导致以下代码大写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/(我尝试过的地方)。

【问题讨论】:

  • "ben's pies" - 撇号 而不是 右单引号' (U+2019)

标签: c# asp.net .net string


【解决方案1】:

如果您打印 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);

【讨论】:

  • 啊哈。似乎我一直错误地认为 iPad 键盘上的撇号在 K 字母上。现在看着它,我需要按住 K 键并选择第三个弹出窗口。我猜大多数人都会犯这个错误,所以我可能需要先以编程方式替换它,因为它来自用户输入公司名称的网页文本框。
  • @user1946932:唉,引号、撇号和笔画很容易混用。
  • 更新:在网上阅读后,我发现 iOS11+ 有 Settings>Keyboard>Smart Punctuation>On 可以立即将通过 K 键输入的普通撇号 (0x27) 转换为“更漂亮” (0x2019) RIGHT SINGLE引号。
  • @user1946932:我明白了;很多用户习惯将撇号作为单引号减号而不是破折号连字符等):我会说,“这是多么糟糕的做法!”。苹果试图解决这个问题,但似乎实际上带来了更多问题。
  • 实际上 U+2019 兼作(卷曲)撇号。您不会在专业排版中使用直撇号 (U+0027)。见smartquotesforsmartpeople.com。所以我认为 ToTitleCase 的这种行为是一个错误。
【解决方案2】:

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

ToTitleCase 方法提供了一种在语言上不一定正确的任意大小写行为。语言上正确的解决方案需要额外的规则,而当前的算法更简单、更快。我们保留在未来使这个 API 变慢的权利。

【讨论】:

  • 抱歉,示例中的不是撇号,而是“右单引号 (U+2019)”。请在"ben's pies" 上加上撇号,并看到s 在这种情况下没有大写
  • 谢谢。你是对的。如上所述的 iPad 键盘。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2019-08-08
  • 2023-01-20
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多