Skip to content

Commit fab01db

Browse files
committed
[fix] 如果分隔符是 \u0001,则必须使用Ordinal,否则无法分割直接返回0。在RocketMQ中有这种情况。NewLifeX/NewLife.RocketMQ#93
1 parent 5e63e44 commit fab01db

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

NewLife.Core/Extension/StringHelper.cs

+5-4
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,14 @@ public static Int32[] SplitAsInt(this String? value, params String[] separators)
126126
if (nameValueSeparator.IsNullOrEmpty()) nameValueSeparator = "=";
127127
//if (separator == null || separator.Length <= 0) separator = new String[] { ",", ";" };
128128

129-
var ss = value.Split(new[] { separator }, StringSplitOptions.RemoveEmptyEntries);
129+
var ss = value.Split([separator], StringSplitOptions.RemoveEmptyEntries);
130130
if (ss == null || ss.Length <= 0) return dic;
131131

132132
var k = 0;
133133
foreach (var item in ss)
134134
{
135-
var p = item.IndexOf(nameValueSeparator);
135+
// 如果分隔符是 \u0001,则必须使用Ordinal,否则无法分割直接返回0。在RocketMQ中有这种情况
136+
var p = item.IndexOf(nameValueSeparator, StringComparison.Ordinal);
136137
if (p <= 0)
137138
{
138139
dic[$"[{k}]"] = item;
@@ -544,7 +545,7 @@ public static String CutStart(this String str, params String[] starts)
544545

545546
for (var i = 0; i < starts.Length; i++)
546547
{
547-
var p = str.IndexOf(starts[i]);
548+
var p = str.IndexOf(starts[i], StringComparison.Ordinal);
548549
if (p >= 0)
549550
{
550551
str = str[(p + starts[i].Length)..];
@@ -565,7 +566,7 @@ public static String CutEnd(this String str, params String[] ends)
565566

566567
for (var i = 0; i < ends.Length; i++)
567568
{
568-
var p = str.LastIndexOf(ends[i]);
569+
var p = str.LastIndexOf(ends[i], StringComparison.Ordinal);
569570
if (p >= 0)
570571
{
571572
str = str[..p];

XUnitTest.Core/Extension/StringHelperTests.cs

+13
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,17 @@ public void SplitAsDictionary()
101101
Assert.False(rules.ContainsKey("ip"));
102102
Assert.False(rules.ContainsKey("iP"));
103103
}
104+
105+
[Fact]
106+
public void SplitAsDictionary2()
107+
{
108+
var str = "TAGS\u0001Tag1\u0002KEYS\u0001Key1\u0002DELAY\u00012\u0002WAIT\u0001False\u0002";
109+
var dic = str.SplitAsDictionary("\u0001", "\u0002");
110+
111+
Assert.Equal(4, dic.Count);
112+
Assert.Equal("Tag1", dic["TAGS"]);
113+
Assert.Equal("Key1", dic["Keys"]);
114+
Assert.Equal("2", dic["DELAY"]);
115+
Assert.Equal("False", dic["WAIT"]);
116+
}
104117
}

0 commit comments

Comments
 (0)