ArgumentOutOfRangeException 使用 IndexOf 和 CultureInfo 1031
ArgumentOutOfRangeException using IndexOf with CultureInfo 1031
string s = "Gewerbegebiet Waldstraße"; //other possible input "Waldstrasse"
int iFoundStart = s.IndexOf("strasse", StringComparison.CurrentCulture);
if (iFoundStart > -1)
s = s.Remove(iFoundStart, 7);
我是 运行 CultureInfo 1031(德语)。
IndexOf 匹配 'straße' 或 'strasse' 并定义 'strasse' 和 returns 18 作为位置。
Remove 和 Replace 都没有设置文化的任何过载。
如果我使用删除 1 个字符删除 6 个字符,如果输入字符串是 'strasse' 并且 'straße' 将起作用。
如果输入字符串是 'straße' 并且我删除了 7 个字符,我会得到 ArgumentOutOfRangeException。
有没有办法安全地删除找到的字符串?提供 IndexOf 的最后索引的任何方法?我更深入地研究了 IndexOf 并且它是预期的内幕下的本机代码 - 所以无法自己做一些事情......
本机 Win32 API 确实暴露了找到的字符串的长度。可以用P/Invoke直接调用FindNLSStringEx
:
static class CompareInfoExtensions
{
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern int FindNLSStringEx(string lpLocaleName, uint dwFindNLSStringFlags, string lpStringSource, int cchSource, string lpStringValue, int cchValue, out int pcchFound, IntPtr lpVersionInformation, IntPtr lpReserved, int sortHandle);
const uint FIND_FROMSTART = 0x00400000;
public static int IndexOfEx(this CompareInfo compareInfo, string source, string value, int startIndex, int count, CompareOptions options, out int length)
{
// Argument validation omitted for brevity
return FindNLSStringEx(compareInfo.Name, FIND_FROMSTART, source, source.Length, value, value.Length, out length, IntPtr.Zero, IntPtr.Zero, 0);
}
}
static class Program
{
static void Main()
{
var s = "<<Gewerbegebiet Waldstraße>>";
//var s = "<<Gewerbegebiet Waldstrasse>>";
int length;
int start = new CultureInfo("de-DE").CompareInfo.IndexOfEx(s, "strasse", 0, s.Length, CompareOptions.None, out length);
Console.WriteLine(s.Substring(0, start) + s.Substring(start + length));
}
}
我没有看到使用纯 BCL 来执行此操作的方法。
string s = "Gewerbegebiet Waldstraße"; //other possible input "Waldstrasse"
int iFoundStart = s.IndexOf("strasse", StringComparison.CurrentCulture);
if (iFoundStart > -1)
s = s.Remove(iFoundStart, 7);
我是 运行 CultureInfo 1031(德语)。
IndexOf 匹配 'straße' 或 'strasse' 并定义 'strasse' 和 returns 18 作为位置。
Remove 和 Replace 都没有设置文化的任何过载。
如果我使用删除 1 个字符删除 6 个字符,如果输入字符串是 'strasse' 并且 'straße' 将起作用。 如果输入字符串是 'straße' 并且我删除了 7 个字符,我会得到 ArgumentOutOfRangeException。
有没有办法安全地删除找到的字符串?提供 IndexOf 的最后索引的任何方法?我更深入地研究了 IndexOf 并且它是预期的内幕下的本机代码 - 所以无法自己做一些事情......
本机 Win32 API 确实暴露了找到的字符串的长度。可以用P/Invoke直接调用FindNLSStringEx
:
static class CompareInfoExtensions
{
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern int FindNLSStringEx(string lpLocaleName, uint dwFindNLSStringFlags, string lpStringSource, int cchSource, string lpStringValue, int cchValue, out int pcchFound, IntPtr lpVersionInformation, IntPtr lpReserved, int sortHandle);
const uint FIND_FROMSTART = 0x00400000;
public static int IndexOfEx(this CompareInfo compareInfo, string source, string value, int startIndex, int count, CompareOptions options, out int length)
{
// Argument validation omitted for brevity
return FindNLSStringEx(compareInfo.Name, FIND_FROMSTART, source, source.Length, value, value.Length, out length, IntPtr.Zero, IntPtr.Zero, 0);
}
}
static class Program
{
static void Main()
{
var s = "<<Gewerbegebiet Waldstraße>>";
//var s = "<<Gewerbegebiet Waldstrasse>>";
int length;
int start = new CultureInfo("de-DE").CompareInfo.IndexOfEx(s, "strasse", 0, s.Length, CompareOptions.None, out length);
Console.WriteLine(s.Substring(0, start) + s.Substring(start + length));
}
}
我没有看到使用纯 BCL 来执行此操作的方法。