Decodificando un personaje especial en C #

Me pregunto cómo podría decodificar el personaje especial • a HTML?

Intenté usar System.Web.HttpUtility.HtmlDecode pero aún no tuve suerte.

El problema aquí no es la deencoding HTML, sino que el texto se codificó en un conjunto de caracteres (por ejemplo, Windows-1252) y luego se codificó de nuevo como un segundo (UTF-8).

En UTF-8, se decodifica como E2 80 A2 . Cuando esta secuencia de bytes se lee utilizando la encoding de Windows-1252, E2 80 A2 codifica como • . (Se guarda nuevamente como UTF-8 • convierte en C3 A2 E2 82 AC C2 A2 20 54 65 73 74 ).

Si el archivo es un archivo codificado en Windows-1252, el archivo simplemente se puede leer con la encoding correcta (por ejemplo, como argumento para un constructor de StreamReader):

 new StreamReader(..., Encoding.GetEncoding("windows-1252")); 

Si el archivo se guardó con una encoding incorrecta, la encoding puede revertirse en algunos casos. Por ejemplo, para la secuencia de cadena en su pregunta, puede escribir:

 string s = "•"; // the string sequence that is not properly encoded var b = Encoding.GetEncoding("windows-1252").GetBytes(s); // b = `E2 80 A2` string c = Encoding.UTF8.GetString(b); // c = `•` 

Tenga en cuenta que muchos caracteres comunes no imprimibles están en el rango U+2000 a U+2044 ( Referencia ), como “comillas tipográficas”, viñetas y guiones. Por lo tanto, la secuencia â€? ? Dónde ? es cualquier caracter, típicamente significará este tipo de error de encoding. Esto permite que este tipo de error se corrija de manera más amplia:

 static string CorrectText(string input) { var winencoding = Encoding.GetEncoding("windows-1252"); return Regex.Replace(input, "â€.", m => Encoding.UTF8.GetString(winencoding.GetBytes(m.Value))); } 

Llamar a esta función con texto mal formado de esta manera corregirá algunos (pero no todos) errores. Por ejemplo, CorrectText("•Test–or“") devolverá el CorrectText("•Test–or“") •Test–or“ deseado •Test–or“ .

HtmlDecode es para convertir cadenas codificadas en HTML en un formato de cadena legible. Quizás HtmlEncode podría ser lo que realmente estás buscando.