为什么用 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("á", "á");
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 代码。需要什么才能让它工作?
更新
回复评论,这是我加载的文件的内容:
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 á
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.
我想用相应的 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ñ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("á", "á");
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 代码。需要什么才能让它工作?
更新
回复评论,这是我加载的文件的内容:
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
á
las repetidas instancias que el Caballero Trelawney, el Doctor Livesey y otros muchosseñ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.