2013-02-20 11 views
13

Mi è stata data un'esportazione da un database MySQL che sembra aver avuto la codifica un po 'confusa nel tempo e contiene un mix di HTML char codes come & uuml; e altri caratteri problematici che rappresentano le stesse lettere, ad esempio ü e Ã. È mio compito riportare una certa consistenza al file e inserire tutto nei caratteri latini corretti, ad es. ú e ó.Conversione di caratteri speciali come ü e Ãdi nuovo al loro corrispettivo originale alphbet latino in C#

Un esempio del tipo di stringa che sto trattando è

Desinfektionslösungstücher für Flächen

Che dovrebbe equivalere a

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

Esiste un metodo disponibile in C# /. Net 4.5 che ricodificherà correttamente i mi piace di ü e à t o UTF-8?

Altrimenti quale approccio sarebbe consigliabile?

È inoltre il carattere di paragrafo nella stringa di esempio precedente un carattere di paragrafo effettivo o parte di qualche altra combinazione di caratteri?

Ho creato una tabella di ricerca in caso di necessità di trovare e sostituire che è inferiore, tuttavia non sono sicuro di quanto sia completo.

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

Punto di pedanteria: 'ü' e' Ã' non sono "caratteri speciali" esattamente, ma ** [Mojibake] (https://en.wikipedia.org/wiki/Mojibake) **. – Boann

+0

@Boann ped away ... interessante –

+0

A parte il tuo post è in qualche modo fuorviante, dopo aver riparato i dati ho ottenuto "Desinfektionslösungstücher für Flächen", che sembra essere corretto ma nel tuo risultato previsto hai spazi. – Esailija

risposta

19

Beh, prima di tutto, come i dati sono stati decodificati utilizzando la codifica sbagliata, è probabile che alcuni dei personaggi sono impossibili da recuperare. Sembra che i dati UTF-8 vengano decodificati in modo errato utilizzando una codifica a 8 bit.

Non esiste un metodo integrato per recuperare dati come questo, perché non è qualcosa che normalmente si fa. Non esiste un modo affidabile per decodificare i dati, perché è già rotto.

Che cosa si può provare, è quello di codificare i dati, e decodificare utilizzando nuovamente la codifica sbagliata, proprio il contrario:

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

Il Encoding.Default utilizza la codifica ANSI corrente per il sistema. Puoi provare alcune codifiche diverse lì e vedere quale dà il miglior risultato.

+0

Grazie, penso che la tua teoria che i dati potrebbero essere irrecuperabili potrebbe essere corretta. Ho spezzato la corda in questo modo ... 50 Tattoo Desinfektionsl ö sungst ü cher f ü r Fl ä chen --- e --- 50 Tattoo Desinfektionsl ö sungst cher cher fü r Flä chen. quindi so cosa dovrebbe apparire, ma non posso ancora convertire –

+0

Il tuo codice combinato con i risultati di @pawlakppp ha risolto il problema, quindi grazie a entrambi. –

3

Probabilmente è una stringa codificata Windows-1252 che si legge come UTF-8.

Poiché i dati di cui Guffa sono stati danneggiati.

consente di dare un'occhiata su byte:
ö -> C3B6 in UTF8

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

così ö -> ¶

che dire di tutti questi "ƒÂ":

ƒ -> 83 Â -> C2

L'onestà non so perché appaiono, ma puoi provare a cancellarli e fare alcune conversioni come menzionato da Guffa. Buona fortuna

+0

Grazie, sto seguendo le stesse linee di indagine e ho rimosso "ƒ". Una re-esportazione dei dati li ha rimossi e ha trasformato gli A-hats in A-tildes che è buono, quindi sembra esserci una conversione chiara come spiegato qui: http://www.i18nqa.com/debug/utf8-debug .html –

11

I dati sono solo in parte irrecuperabili a causa della codifica Windows-1252 con 5 slot non assegnati. Alcune modifiche di Windows-1252 riempiono questi con i caratteri di controllo ma quelli non si collegano ai messaggi in Stackoverflow. Se modificato Windows-1252 è stato utilizzato è possibile ripristinare completamente finché non si perde i caratteri di controllo nascosti nelle paste di copia.

C'è anche il carattere di spazio non interrotto che viene ignorato o trasformato in uno spazio di solito con copypastes, ma questo non è un problema quando si gestiscono i byte direttamente.

L'abuso misencoding questa stringa ha attraversato è:

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

a recuperare, ecco un esempio:

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

Grazie, proverò con questo approccio. –

0

Sono stato turbato da questo problema di carbone prima. Soluzione:

My. (Cs) il file html era UTF-8; Ho convertito in UTF-8Y (UTF-8 con una distinta base).

Problemi correlati