当下一个字符是Prime符号(char)697时,String.StartsWith not working

时间:2015-10-02 16:28:10

标签: c# string escaping diacritics startswith

我正在尝试使用带有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中提出的方法,但它返回了false:

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

rnorm()MODIFIER LETTER PRIME是间距修饰符字母。它不是一个真正的角色,而是一个修改前一个角色的特殊用途符号。

From MSDN

  

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

ʹ返回false,因为在你的连接字符串中, 6 实际上被后面附加的主要符号修改。

答案 1 :(得分: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.");
}