Ho un database sql-server 2010 condiviso tra due applicazioni. Un'applicazione su cui abbiamo il controllo e l'altra applicazione è un'app di terze parti che ha creato il database in primo luogo. La nostra app è un CRM costruito sopra l'app webmail di terze parti.Rilevamento della codifica UTF-8 errata: elenco di caratteri errati da annusare?
Il database contiene colonne varchar ed è codificato in latin-1. L'app di terze parti è scritta in php e non si preoccupa di codificare correttamente i dati, quindi inserisce byte codificati utf-8 nelle colonne varchar, dove vengono interpretati come latin-1 e sembrano immondizia.
La nostra app CRM è scritta in .Net, che rileva automaticamente che la raccolta del database è diversa dalla codifica della stringa in memoria, quindi quando .Net scrive su un database, converte i byte in modo che corrispondano alla codifica del database.
Quindi ... i dati scritti nel db dalla nostra app sembrano corretti nel db, ma i dati dall'app di terze parti no.
quando la nostra applicazione scrive FirstName = Céline, viene memorizzato nel DB come Céline
quando l'applicazione webmail scrive FirstName = Céline è memorizzato nel db come CÃ © line
nostro CRM esigenze app per visualizzare i contatti che sono stati creati in entrambi i sistemi. Quindi sto scrivendo una classe EncodingSniffer che cerca caratteri contrassegnati che indicano una stringa scarsamente codificata e li converte.
Attualmente ho:
private static string[] _flaggedChars = new string[] { "é" };
che funziona alla grande per la visualizzazione di CÃ © line come Céline, ma ho bisogno di aggiungere alla lista.
Qualcuno sa di una risorsa per ottenere tutti i possibili modi in cui i caratteri speciali di utf-8 potrebbero essere interpretati come iso-8859-1?
Grazie
Chiarimento: Dal momento che sto lavorando in .Net. La stringa, caricata in memoria dal database, viene convertita in Unicode UTF-16. Quindi, indipendentemente dal fatto che sia stato codificato correttamente nel database. Ora è rappresentato come byte UTF16. Devo essere in grado di analizzare i byte UTF-16 e determinare se sono stati rovinati a causa del fatto che utf-8 byte sono stati inseriti in un database iso-8859-1 .... chiaro come il fango giusto?
Ecco quello che ho finora. Ha ripulito la maggior parte dei caratteri non correttamente codificati, ma ho ancora problemi con É ad esempio: Éric è memorizzato nel db da webmail come à ‰ ric, ma dopo aver rilevato una codifica errata e averlo cambiato, viene visualizzato come ? ric Guardando un utente che dispone di 2500 contatti, centinaia dei quali erano codificano le questioni, la E è l'unica cosa che non viene visualizzata correttamente ...
public static Regex CreateRegex()
{
string specials = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö";
List<string> flags = new List<string>();
foreach (char c in specials)
{
string interpretedAsLatin1 = Encoding.GetEncoding("iso-8859-1").GetString(Encoding.UTF8.GetBytes(c.ToString())).Trim();//take the specials, treat them as utf-8, interpret them as latin-1
if (interpretedAsLatin1.Length > 0)//utf-8 chars made up of 2 bytes, interpreted as two single byte latin-1 chars.
flags.Add(interpretedAsLatin1);
}
string regex = string.Empty;
foreach (string s in flags)
{
if (regex.Length > 0)
regex += '|';
regex += s;
}
return new Regex("(" + regex + ")");
}
public static string CheckUTF(string data)
{
Match match = CreateRegex().Match(data);
if (match.Success)
return Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(data));//from iso-8859-1 (latin-1) to utf-8
else
return data;
}
Quindi: É viene convertita in 195' Ã ', 8240' ‰ '
è un'opzione per modificare la codifica DB a UTF-8, sembra la soluzione più semplice in quanto non c'è un 1 a 1 conversione tra unicode e latin-1 –
Test se la stringa è UTF valida -8 potrebbe essere un approccio migliore. (Probabilmente anche meno costoso.) – Mat
@Mat, è essenzialmente quello che sto cercando di fare, semplicemente non so come. e il cattivo approccio al fiuto del personaggio è stato il migliore che ho trovato. Come faresti a testare l'utf-8 valido? – Michael