为什么用 html 代码替换重音字符的代码无法正常工作?

Why does this code to replace accented chars with html codes fail to work?

我想用相应的 HTML 代码(例如 á、ñ、¿、¡ 等)替换重音字符(例如 á、ñ、¿、¡ 等)。

比如这行文字:

Imposible me ha sido rehusarme á las repetidas instancias que el Caballero Trelawney, el Doctor Livesey y otros muchos señores me

...应该变成:

Imposible me ha sido rehusarme á las repetidas instancias que el Caballero Trelawney, el Doctor Livesey y otros muchos señores me

这应该很简单。我有这个代码来进行尝试:

private void buttonReplaceCharsWithCodes_Click(object sender, EventArgs e)
{
    String fallName = String.Empty;
    List<String> linesModified = new List<string>();
    StreamReader file = null;

    try // finally
    {
        try // catch
        {

            DialogResult result = openFileDialog1.ShowDialog();
            if (result == DialogResult.OK)
            {
                fallName = openFileDialog1.FileName;
            }
            file = new StreamReader(fallName);
            String line;
            while ((line = file.ReadLine()) != null)
            {
                linesModified.Add(line);
            }

            progressBar1.Maximum = linesModified.Count;
            progressBar1.Value = 0;
            labelProgFeedback.Text = "Replacing accented chars with HTML codes";

            for (int i = 0; i < linesModified.Count; i++)
            {
                linesModified[i] = linesModified[i].Replace("á", "&aacute;");
                linesModified[i] = linesModified[i].Replace("Á", "&Aacute;");
                linesModified[i] = linesModified[i].Replace("é", "&eacute;");
                linesModified[i] = linesModified[i].Replace("É", "&Eacute;");
                linesModified[i] = linesModified[i].Replace("í", "&iacute;");
                linesModified[i] = linesModified[i].Replace("Í", "&Iacute;");
                linesModified[i] = linesModified[i].Replace("ñ", "&ntilde;");
                linesModified[i] = linesModified[i].Replace("Ñ", "&Ntilde;");
                linesModified[i] = linesModified[i].Replace("ó", "&oacute;");
                linesModified[i] = linesModified[i].Replace("Ó", "&Oacute;");
                linesModified[i] = linesModified[i].Replace("ú", "&uacute;");
                linesModified[i] = linesModified[i].Replace("Ú", "&Uacute;");
                linesModified[i] = linesModified[i].Replace("ü", "&uuml;");
                linesModified[i] = linesModified[i].Replace("Ü", "&Uuml;");
                linesModified[i] = linesModified[i].Replace("¿", "&iquest;");
                linesModified[i] = linesModified[i].Replace("¡", "&iexcl;");
                progressBar1.PerformStep();
            }
            progressBar1.Value = 0;
        }
        catch (Exception ex)
        {
            MessageBox.Show(String.Format("Exception {0}", ex.Message));
        }
    }
    finally
    {
        String massagedFileName = String.Format("{0}_Massaged.txt", fallName);
        File.WriteAllLines(massagedFileName, linesModified);
        file.Close();
    }

}

不幸的是,它不起作用。它将重音字符替换为“到底是什么?!?”符号 (�) 而不是所需的 HTML 代码。需要什么才能让它工作?

更新

回复评论,这是我加载的文件的内容:

Imposible me ha sido rehusarme á las repetidas instancias que el Caballero Trelawney, el Doctor Livesey y otros muchos señores me han hecho para que escribiese la historia circunstanciada y completa de la Isla del Tesoro. Voy, pues, á poner manos á la obra contándolo todo, desde el alfa hasta el omega, sin dejarme cosa alguna en el tintero, exceptuando la determinación geográfica de la isla, y esto tan solamente porque tengo por seguro que en ella existe todavía un tesoro no descubierto. Tomo la pluma en el año de gracia de 17-- y retrocedo hasta la época en que mi padre tenía aún la posada del "Almirante Benbow," y hasta el día en que por primera vez llegó á alojarse en ella aquel viejo marino de tez bronceada y curtida por los elementos, con su grande y visible cicatriz.

...这是它保存的替换文件:

Imposible me ha sido rehusarme � las repetidas instancias que el Caballero Trelawney, el Doctor Livesey y otros muchos se�ores me han hecho para que escribiese la historia circunstanciada y completa de la Isla del Tesoro. Voy, pues, � poner manos � la obra cont�ndolo todo, desde el alfa hasta el omega, sin dejarme cosa alguna en el tintero, exceptuando la determinaci�n geogr�fica de la isla, y esto tan solamente porque tengo por seguro que en ella existe todav�a un tesoro no descubierto. Tomo la pluma en el a�o de gracia de 17-- y retrocedo hasta la �poca en que mi padre ten�a a�n la posada del "Almirante Benbow," y hasta el d�a en que por primera vez lleg� � alojarse en ella aquel viejo marino de tez bronceada y curtida por los elementos, con su grande y visible cicatriz.

IOW,替换没有发生 - 我只是看到“神秘”字符而不是 HTML 代码。

当我单步执行代码并检查“linesModified”的各个行(我看到了)时,我在运行时看到了同样的事情。我猜比看星星还好。

这是一个过程:这是一个简单的实用程序,我在其中单击按钮打开 (.txt) 文件。处理后,它将文件的新版本保存到新文件中。

更新 2

因为可以显式保存为 UTF8,我认为在读取文件时这样做可能会被证明是有利的,但是:

while ((line = file.ReadLine(ASCIIEncoding.UTF8)) != null)

...不编译,说没有采用 1 个参数的 ReadLine 方法的重载。

我唯一能想到的就是在文件写入时专门指定您的编码,例如:

File.WriteAllLines(massagedFileName, linesModified, Encoding.UTF8);

Jerome Laben here 的回答有效 - 我只需要更改这行代码:

file = new StreamReader(fallName);

...为此:

file = new StreamReader(fallName, Encoding.Default, true);

...现在可以使用了:

Imposible me ha sido rehusarme &aacute; las repetidas instancias que el Caballero Trelawney, el Doctor Livesey y otros muchos se&ntilde;ores me han hecho para que escribiese la historia circunstanciada y completa de la Isla del Tesoro. Voy, pues, &aacute; poner manos &aacute; la obra cont&aacute;ndolo todo, desde el alfa hasta el omega, sin dejarme cosa alguna en el tintero, exceptuando la determinaci&oacute;n geogr&aacute;fica de la isla, y esto tan solamente porque tengo por seguro que en ella existe todav&iacute;a un tesoro no descubierto. Tomo la pluma en el a&ntilde;o de gracia de 17-- y retrocedo hasta la &eacute;poca en que mi padre ten&iacute;a a&uacute;n la posada del "Almirante Benbow," y hasta el d&iacute;a en que por primera vez lleg&oacute; &aacute; alojarse en ella aquel viejo marino de tez bronceada y curtida por los elementos, con su grande y visible cicatriz.