Предполагая, что вы можете умещаться файл HTML в StringBuilder
, вы можете взять несколько разных подходов. Во-первых, я предполагаю, что у вас есть все ваши символьные замены, хранящимися в словаре:
var replacements = new Dictionary<char,string> {
{ '®', "‰" },
// ...etc
}
Во-первых, прочитать файл в StringBuilder
:
var html = new StringBuilder(File.ReadAllText(filename));
Первый подход заключается в том, что вы могли бы использовать StringBuilder.Replace(string,string)
:
foreach(var c in replacements.Keys) {
html.Replace(c.ToString(), replacements[c]);
}
Второй подход должен был бы пройти через каждый символ в файле и посмотреть, если он нуждается в замене (обратите внимание, что мы начинаем backwar ds из конца файла; если бы мы пошли вперед, мы постоянно бы того, чтобы изменить наше значение индекса, так как мы добавим длину файл):
for(int i=html.Length-1; i>0; i--) {
var c = html[i];
if(replacements.ContainsKey(c)) {
html.Remove(i, 1);
html.Insert(i, replacements[c]);
}
}
Трудно сказать, что было бы более эффективным, без либо имеющей подробной информации о реализации от StringBuilder.Replace(string,string)
или делать некоторые профилирования, но я оставлю это до вас.
Если вы не можете загрузить весь ваш HTML-файл в StringBuilder
, вы можете использовать вариацию второго метода с StreamReader
, считывая файл по одному байту за раз.
Я бы предположил, что не все элементы являются специальными символами? '