【发布时间】: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 muchosseñoresme
这应该很简单。我有这段代码可以尝试:
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("á", "á");
linesModified[i] = linesModified[i].Replace("Á", "Á");
linesModified[i] = linesModified[i].Replace("é", "é");
linesModified[i] = linesModified[i].Replace("É", "É");
linesModified[i] = linesModified[i].Replace("í", "í");
linesModified[i] = linesModified[i].Replace("Í", "Í");
linesModified[i] = linesModified[i].Replace("ñ", "ñ");
linesModified[i] = linesModified[i].Replace("Ñ", "Ñ");
linesModified[i] = linesModified[i].Replace("ó", "ó");
linesModified[i] = linesModified[i].Replace("Ó", "Ó");
linesModified[i] = linesModified[i].Replace("ú", "ú");
linesModified[i] = linesModified[i].Replace("Ú", "Ú");
linesModified[i] = linesModified[i].Replace("ü", "ü");
linesModified[i] = linesModified[i].Replace("Ü", "Ü");
linesModified[i] = linesModified[i].Replace("¿", "¿");
linesModified[i] = linesModified[i].Replace("¡", "¡");
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 代码。要让它工作需要什么?
更新
作为对 cmets 的回答,这是我加载的文件的内容:
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