2013-02-20 10 views
13

Dostałem eksport z bazy danych MySQL, która wydawała się mieć nieco zakodowane kodowanie i zawiera mieszankę HTML char codes, taką jak & uuml; i innych problematycznych znaków reprezentujących te same litery, na przykład ü i Ã. Moim zadaniem jest przywrócenie spójności pliku i uzyskanie wszystkich poprawnych znaków łacińskich, np. ú i ó.Konwertowanie specjalnych znaków, takich jak ü i Ã, z powrotem do ich oryginalnych, łacińskich odpowiedników w alfabecie w C#

Przykładem rodzaju sznurka mam do czynienia z jest

Desinfektionslösungstücher für Flächen

Która powinna równać się

50 Tattoo Desinfektionsl ö sungst ü cher f ü r Fl ä chen 
50 Tattoo Desinfektionsl ö sungst ü cher f ü r Fl ä chen 

Czy istnieje metoda dostępny w C#/.Net 4.5, który z powodzeniem ponownie kodowałby, takie jak ü i à t o UTF-8?

Inne, jakie podejście byłoby wskazane?

Czy w powyższym przykładzie występuje również znak akapitu ? Rzeczywisty znak akapitu lub część innej kombinacji znaków?

Utworzyłem tabelę odnośników w przypadku konieczności znalezienia i zamiany poniżej, jednak nie jestem pewien, jak to jest kompletne.

É -> É 
“ -> " 
†-> " 
Ç -> Ç 
à -> à 
é, 'é 
à -> À 
ú -> ú 
• -> - 
Ø -> Ø 
õ -> õ 
í -> í 
â -> â 
ã -> ã 
ê -> ê 
á -> á 
é -> é 
ó -> ó 
– -> – 
ç -> ç 
ª -> ª 
º -> º 
à -> à 
+5

Miejsce pedanterii: 'ü' i' Ã' nie są "znakami specjalnymi" dokładnie, ale ** [Mojibake] (https://en.wikipedia.org/wiki/Mojibake) **. – Boann

+0

@Boann ped away ... ciekawe –

+0

Btw twój post jest nieco mylący, po naprawieniu danych otrzymałem 'Desinfektionslösungstücher für Flächen', który wydaje się być poprawny, ale w twoim oczekiwanym wyniku masz spacje. – Esailija

Odpowiedz

19

Cóż, przede wszystkim, gdy dane zostały dekodowane przy użyciu złego kodowania, to jest prawdopodobne, że niektóre znaki są niemożliwe do odzyskania. Wygląda na to, że jest to dane UTF-8, które zostały niepoprawnie zdekodowane przy użyciu 8-bitowego kodowania.

Nie ma wbudowanej metody odzyskiwania takich danych, ponieważ nie jest to normalne działanie. Nie ma niezawodnego sposobu dekodowania danych, ponieważ jest on już uszkodzony.

Co można spróbować, to do kodowania danych i dekodować go ponownie przy użyciu niewłaściwego kodowania, tylko na odwrót:

byte[] data = Encoding.Default.GetBytes(input); 
string output = Encoding.UTF8.GetString(data); 

Encoding.Default wykorzystuje aktualną kodowanie ANSI dla swojego systemu. Możesz wypróbować różne kodowania i sprawdzić, który z nich daje najlepszy wynik.

+0

Dzięki, myślę, że twoja teoria, że ​​dane mogą być nieodwracalne, może być poprawna. Zepsułem sznurek tak, jak ... 50 Tattoo Desinfektionsl ö sungst ü cher f ü r Fl ä chen --- and --- 50 Tattoo Desinfektionsl à ¶ sungst ü¼ cher f Ã,¼ r Fl à ¼ chen. więc wiem, co powinno się pojawić, ale wciąż nie można przekonwertować kodu. –

+0

Twój kod w połączeniu z ustaleniami @pawlakppp rozwiązał problem, więc dzięki wam. –

3

To prawdopodobnie zakodowany w systemie Windows-1252 ciąg znaków, który odczytałeś jako UTF-8.

Ponieważ wymienione dane Guffa zostały uszkodzone.

Pozwala spojrzeć na bajtów:
O -> C3B6 w UTF8

w windows-1252 C3 -> A B6 -> ¶

tak ö -> ö

co o tych wszystkich "ƒÂ":

ƒ -> 83 A -> C2

Uczciwość nie wiem, dlaczego się pojawiają, ale możesz spróbować je wymazać i wykonać kilka konwersji, o czym wspomniał Guffa. Powodzenia

+0

Dzięki, ja sam śledzę te same kwestie i usunąłem "ƒ". Ponowny eksport danych usunął je i zamienił A-kapelusze na A-tyldy, co jest dobre, a następnie wydaje się, że istnieje wyraźna konwersja, jak przedstawiono tutaj: http://www.i18nqa.com/debug/utf8-debug .html –

11

Dane są częściowo niemożliwe do odzyskania dzięki kodowaniu Windows-1252 z 5 nieprzypisanymi gniazdami. Niektóre modyfikacje Windows-1252 napełniają je znakami kontrolnymi , ale te nie trafiają do postów w Stackoverflow. Jeśli zmodyfikowano Windows-1252, możesz w pełni zregenerować się, dopóki nie utracisz ukrytych znaków kontrolnych w kopiowanych pastach.

Istnieje również znak spacji, który nie jest łamany, który jest ignorowany lub zamieniany w przestrzeń zwykle z copypastes, ale nie jest to problemem, gdy mamy do czynienia z bajtami bezpośrednio.

misencoding nadużycie napis ten przeszedł to:

UTF-8 -> Windows-1252 -> UTF-8 -> Windows-1252 

Aby odzyskać, oto przykład:

String a = "Desinfektionslösungstücher für Flächen"; 
Encoding utf8 = Encoding.GetEncoding(65001); 
Encoding win1252 = Encoding.GetEncoding(1252); 

string result = utf8.GetString(win1252.GetBytes(utf8.GetString(win1252.GetBytes(a)))); 

Console.WriteLine(result); 
//Desinfektionslösungstücher für Flächen 
+0

Dzięki, wypróbuję to podejście. –

0

Przedtem miałem problem z tym znakiem. Rozwiązanie:

Mój. (Cs) plik html był UTF-8; Przekształciłem się w UTF-8Y (UTF-8 z BOMem).

Powiązane problemy