【问题标题】:Why does this code to replace accented chars with html codes fail to work?为什么这段用 html 代码替换重音字符的代码不起作用?
【发布时间】:2015-08-31 06:09:42
【问题描述】:

我想用相应的 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 代码。要让它工作需要什么?

更新

作为对 cme​​ts 的回答,这是我加载的文件的内容:

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 德索罗岛。 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 todavia 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 primea 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 德索罗岛。 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 primea 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”的各个行时,我在运行时看到了同样的情况(我看到了 �s)。我想,这比看星星要好。

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

更新 2

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

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

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

【问题讨论】:

  • 那么问题是什么?为什么linesModified 仍然包含未替换的字符?或者,为什么 html 仍然显示错误的符号 尽管 linesModified 列表具有正确转义的字符?
  • 这个功能实际上对我来说很好,只需将您的代码复制并粘贴到解决方案中即可。您能否提供更多关于您所看到的内容以及您如何称呼它的详细信息?
  • @sstan: 两者都没有 -linesModified 的重音字符替换,但它们被替换为“�”
  • 尝试在保存之前放置一个断点并在调试器中查看被替换的行。我几乎猜到你用来查看文件的任何东西都是在解释 html 代码而不是显示它们。
  • 如何查看修改后的文件?我只是问,因为我实际上只是复制并粘贴了您的代码,它对我来说很好......所以我猜问题是查看器而不是代码。但这只是猜测。

标签: c# html winforms diacritics non-ascii-characters


【解决方案1】:

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

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

【讨论】:

  • 好主意,但在 WriteAllLines 方法中添加“Encoding.UTF8”没有任何区别。
  • 好吧,我没有主意了。如果我想到其他任何事情,我会更新,但就像我在之前的 cmets 中所说的那样,这一切都对我有用,只需复制和粘贴您的代码。只是出于好奇,您在哪个版本的 Windows 中运行它?我在win7环境中测试,记事本足够聪明,至少可以正确处理那里的所有内容。
  • 是的,我也在 Windows 7 上。 Visual Studio 2010。不过,我对 sstan 的评论感到好奇:真的可以为 IDE 本身分配编码吗?如果是这样,如何,我想知道......
  • 对于它的价值,我在 VS2013 中进行了测试。我在这台 PC 上没有 2010,所以现在无法在那个环境中测试。虽然这不应该有所作为。您要编译到哪个 .Net 版本?
【解决方案2】:

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

file = new StreamReader(fallName);

...到这个:

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

...现在它可以工作了:

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

【讨论】:

    猜你喜欢
    • 2010-09-18
    相关资源
    最近更新 更多