in src/DurableTask.AzureStorage/Tracking/KeySanitation.cs [29:87]
public static string EscapePartitionKey(string key)
{
if (key == null)
{
return null;
}
StringBuilder b = new StringBuilder();
foreach (char c in key)
{
switch (c)
{
case escapeChar:
b.Append(escapeChar);
b.Append(escapeChar);
break;
case '/':
b.Append(escapeChar);
b.Append('0');
break;
case '\\':
b.Append(escapeChar);
b.Append('1');
break;
case '#':
b.Append(escapeChar);
b.Append('2');
break;
case '?':
b.Append(escapeChar);
b.Append('3');
break;
default:
{
uint val = (uint)c;
if (val <= 0x1F || (val >= 0x7F && val <= 0x9F))
{
// characters in this range cannot be used, so we escape them
b.Append(escapeChar);
// and shift them into a valid (unicode) range
b.Append((char) (offset + val));
}
else
{
b.Append(c);
}
break;
}
}
}
return b.ToString();
}