Zastanawiam się, w jaki sposób mogę odszyfrować znak specjalny •
do formatu HTML?Dekodowanie znaku specjalnego w języku C#
Próbowałem używać System.Web.HttpUtility.HtmlDecode
, ale nie było jeszcze szczęścia.
Zastanawiam się, w jaki sposób mogę odszyfrować znak specjalny •
do formatu HTML?Dekodowanie znaku specjalnego w języku C#
Próbowałem używać System.Web.HttpUtility.HtmlDecode
, ale nie było jeszcze szczęścia.
HtmlDecode służy do konwersji łańcuchów zakodowanych w formacie Html w czytelny format napisów. Być może HtmlEncode
może być tym, czego faktycznie szukasz.
Problem tutaj nie polega na dekodowaniu HTML, ale raczej na tym, że tekst został zakodowany w jednym zestawie znaków (np. Windows-1252), a następnie zakodowany ponownie jako drugi (UTF-8).
W UTF-8, •
jest dekodowany jako E2 80 A2
. Kiedy ta sekwencja bajtów jest odczytywana przy użyciu kodowania Windows-1252, koduje się jako •
. (Zapis ponownie UTF-8 •
się C3 A2 E2 82 AC C2 A2 20 54 65 73 74
).
Jeśli plik jest okna-1252 zakodowane pliku, plik może być w prosty sposób odczytać z odpowiedniego kodowania (na przykład, jako argument do konstruktora StreamReader). :
new StreamReader(..., Encoding.GetEncoding("windows-1252"));
Jeśli plik został zapisany z nieprawidłowym kodowaniem, kodowanie może zostać w niektórych przypadkach cofnięte. Na przykład, dla sekwencji łańcucha w swoim pytaniu, można napisać:
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 = `•`
pamiętać, że wiele wspólnych Niedrukowane znaki są w zakresie U+2000
do U+2044
(Reference), takie jak „inteligentnych cudzysłowów”, kul i kresek . Zatem sekwencja â€?
, gdzie ?
jest dowolnym znakiem, będzie typowo oznaczać ten typ błędu kodowania. Pozwala to na tego typu błąd należy skorygować szerzej:
static string CorrectText(string input)
{
var winencoding = Encoding.GetEncoding("windows-1252");
return Regex.Replace(input, "â€.",
m => Encoding.UTF8.GetString(winencoding.GetBytes(m.Value)));
}
Wywołanie tej funkcji z tekstem źle sformułowany w ten sposób poprawić niektóre (ale nie wszystkie) błędy. Na przykład CorrectText("•Test–or“")
zwróci zamierzoną •Test–or“
.
Myślę, że OP chce zobaczyć '•' zamiast 'â € ¢' – Musa
Ah tak .. mówi * znak * nie znaki. – pcnThird
Jak jednak "przetłumaczyć" na '•'? Reprezentacja html punktu wypunktowania to '•' - czy coś mi brakuje? –