Из комментариев вы хотите заменить символы Юникода (например, Ù) на их значение Юникода (& # x00D9). Regex.Replace, вероятно, будет лучшим способом для достижения этого.
Вот цикл обработки файлов:
var files = Directory.GetFiles(path, "*.xml");
foreach (var file in files)
{
string txt = File.ReadAllText(file);
string newTxt = Regex.Replace(
txt,
@"([^\u0000-\u007F]+)",
HandleMatch);
File.WriteAllText(file, newTxt);
}
А вот оценщик матча:
private static char[] replacements = new[]
{
'ø',
'Ù'
};
private static string HandleMatch(Match m)
{
// The pattern for the Regex will only match a single character, so get that character
char c = m.Value[0];
// Check if this is one of the characters we want to replace
if (!replacements.Contains(c))
{
return m.Value;
}
// Convert the character to the 4 hex digit code
string code = ((int) c).ToString("X4");
// Format and return the code
return "&#x" + code;
}
В цикле вам нужно только прочитать файл один раз, тогда метод Regex.Replace будет обрабатывать замену всех экземпляров во входных данных. Шаблон для регулярного выражения будет соответствовать всему, что не находится в диапазоне 0x00 - 0x7f, которые будут первыми 255 символами (символы ASCII).
Если вам нужно заменить только определенные символы Юникода, вам нужно будет составить список этих символов и проверить значение 'c' в функции HandleMatch()
по этому списку.
Комментарии к спектаклю:
Вы пытаетесь выполнить выборочную замену символов для набора файлов. Как минимум, вам нужно будет прочитать каждый файл в память, а затем изучить каждый символ, чтобы убедиться, что он соответствует вашим критериям.
Более производительный параметр может состоять в том, чтобы построить таблицу поиска символов, а затем строки замены для каждого. Компромисс был бы в том, что если бы у вас был большой список символов, которые нужно было заменить, таблица быстро стала бы громоздкой для обслуживания. Вы также оставляете открытым риск ошибок в таблице замены, которую можно найти больше.