14

我从 MS SQL 数据库中读取了一些值,我喜欢对字符串进行一些操作。这是我用来检查某个字符串是否以另一个字符串开头的代码:

String input = "Основното jавно обвинителство денеска поднесе пријава против БМ (59) од Битола заради постоење основи на сомнение дека сторил кривични дела „тешки дела против безбедноста на луѓето и имотот во сообраќајот“ и „неукажување помош на лице повредено во сообраќајна незгода“";
String subString = "Основното јавно обвинителство";
if (input.StartsWith(subString))
{
    Response.Write("OK");
}

然而input.StartsWith(subString)不返回真。有人知道为什么吗?

4

3 回答 3

24

不同之处在于位置 10 中的字符j:其代码在输入中为 106,但在您的子字符串中为 1112(0x458-参见演示)。

您的第二个j来自Unicode 第 4 页

ј   1112    458 0xD1 0x98   CYRILLIC SMALL LETTER JE

它看起来一样,但有不同的代码。

重新输入j修复substring此问题。

于 2013-12-28T16:13:10.497 回答
10

输入中的第二个单词和 subString 不匹配。将字符串放入记事本++中,一次选择每个单词。subString 中的第一个和最后一个单词匹配,但不匹配中间的单词。

此示例演示了该问题:

void Main()
{
    var test = "Основното јавно обвинителство";
    var tost = "Основното jавно обвинителство";

    for(var i = 0; i < test.Length; i++){
        Console.WriteLine(string.Format("1: {0}, 2: {1}, Equal: {2}", test[i], tost[i], test[i] == tost[i]));
        if(test[i] != tost[i]){ Console.WriteLine (string.Format("1: {0}, 2: {1}", (int) test[i], (int) tost[i])); }
    }

    Console.WriteLine (test == tost);
}

相关输出:

1: ј, 2: j, Equal: False
1: 1112, 2: 106
于 2013-12-28T16:11:47.210 回答
6

您发布的字符串不相等。做这个:

string s1 = "Основното јавно обвинителство";
string s2 = "Основното jавно обвинителство";
var bt = Encoding.UTF8.GetBytes(s1);
var bt_1 = Encoding.UTF8.GetBytes(s2);

输出将类似于以下内容:

56
55

实际区别如下。第一个字符串中的“j”是:

[19]    209 byte
[20]    152 byte

而第二个字符串中的“j”是:

[19]    106 byte

第一个ј0xD1 0x98十六进制代码表示,第二个j0x6A十六进制代码表示。

于 2013-12-28T16:17:47.463 回答