【问题标题】:String.StartsWith not Working when next character is the Prime Symbol (char)697当下一个字符是主符号 (char)697 时,String.StartsWith 不起作用
【发布时间】:2025-12-27 15:40:12
【问题描述】:

我正在尝试使用带有 Prime 符号的字符串,但我在使用 String.StartsWith 方法时遇到了一些问题。为什么下面的代码会抛出异常?

string text_1 = @"123456";
string text_2 = @"ʹABCDEF";

string fullText = text_1 + text_2;
if (!fullText.StartsWith(text_1))
{
    throw new Exception("Unexplained bad error.");
}

我怀疑这个问题是因为这个 Prime 符号 (char)697 被视为重音符号,因此正在更改它之前的字母。 (我不认为它应该是 - 它应该是 the prime symbol,因此不应该改变它前面的数字)。我不确定如何进行测试。我确实尝试了this answer 中提出的方法,但它返回错误:

IsLetterWithDiacritics(text_1[5]) //  == False
IsLetterWithDiacritics(fullText[5]) // == False
IsLetterWithDiacritics(fullText[6]) // == False

感谢您的帮助。

【问题讨论】:

  • 您是否尝试过使用采用StringComparison 类型的重载并告诉它使用InvariantCultureOrdinal
  • @BradleyUffner 那行不通,但fullText.StartsWith(text_1, StringComparison.Ordinal) 可以。

标签: c# string escaping diacritics startswith


【解决方案1】:

ʹMODIFIER LETTER PRIME 是间距修饰符字母。它不是真正的字符,而是修饰前面字符的特殊用途符号。

From MSDN

修饰字母是一个独立的空格字符,与组合字符一样,表示对前一个字母的修饰。


string.StartsWith 正在返回 false,因为在您的连接字符串中,6 实际上被附加在它后面的主符号修改。

【讨论】:

  • 谢谢,我也刚刚在我链接的 Wiki 页面底部注意到了这一点。我现在意识到我使用了错误的 Prime 符号 - 应该使用 (char)8242,而不是修饰符字母 prime。感谢您的澄清。
【解决方案2】:

来自MSDN

当您调用字符串比较方法(如 String.Compare、String.Equals 或 String.IndexOf)时,您应该始终调用包含 StringComparison 类型参数的重载,以便您可以指定该方法的比较类型施行。有关详细信息,请参阅在 .NET Framework 中使用字符串的最佳实践。

如果你想进行非语言比较,你应该使用StringComparison.Ordinal。下面的代码不会抛出异常。

string text_1 = @"123456";
string text_2 = @"ʹABCDEF";

string fullText = text_1 + text_2;
if (!fullText.StartsWith(text_1, StringComparison.Ordinal))
{
    throw new Exception("Unexplained bad error.");
}

【讨论】:

    最近更新 更多