假设您可以轻松地将 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] );
}
第二种方法是遍历文件中的每个字符,看看它是否需要替换(请注意,我们从文件末尾向后开始;如果我们向前,我们将不断地修改索引值,因为我们正在向文件添加长度):
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 一次读取一个字节的文件。