У меня есть программа, которая должна быть снабжена нормированными строками. Однако данные, которые поступают, не обязательно чисты, а String.Normalize() вызывает ArgumentException, если строка содержит недопустимые кодовые точки.
То, что я хотел бы сделать, - это просто заменить эти кодовые точки наброски, такие как "?". Но для этого мне нужен эффективный способ поиска строки, чтобы найти их в первую очередь. Что это хороший способ сделать это?
Следующий код работает, но в основном использует try/catch как грубый if-statement, поэтому производительность ужасна. Я просто использую его, чтобы проиллюстрировать поведение, которое я ищу:
private static string ReplaceInvalidCodePoints(string aString, string replacement)
{
var builder = new StringBuilder(aString.Length);
var enumerator = StringInfo.GetTextElementEnumerator(aString);
while (enumerator.MoveNext())
{
string nextElement;
try { nextElement = enumerator.GetTextElement().Normalize(); }
catch (ArgumentException) { nextElement = replacement; }
builder.Append(nextElement);
}
return builder.ToString();
}
(edit:) Я собираюсь преобразовать текст в UTF-32, чтобы я мог быстро перебирать его и видеть, соответствует ли каждый dword действительной кодовой точке. Есть ли функция, которая сделает это? Если нет, есть ли список недействительных диапазонов, плавающих вокруг?