2013-05-16 12 views

Odpowiedz

2

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.

+2

Myślę, że OP chce zobaczyć '•' zamiast 'â € ¢' – Musa

+0

Ah tak .. mówi * znak * nie znaki. – pcnThird

+0

Jak jednak "przetłumaczyć" na '•'? Reprezentacja html punktu wypunktowania to '•' - czy coś mi brakuje? –

5

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“.

Powiązane problemy