У меня есть база данных sql -server 2010, совместно используемая двумя приложениями. Одно приложение находится под нашим контролем, а другое приложение является сторонним -приложением, которое в первую очередь создало базу данных. Наше приложение представляет собой CRM, созданную поверх стороннего приложения веб-почты.
База данных содержит столбцы типа varchar и имеет латинскую -1 кодировку. Стороннее -приложение написано на php и не заботится о правильном кодировании данных, поэтому оно заполняет utf -8 закодированных байтов в столбцах varchar, где они интерпретируются как латинские -1 и выглядят как мусор.
Наше CRM-приложение написано на.Net, который автоматически определяет, что сопоставление базы данных отличается от кодировки строки в памяти, поэтому, когда.Net записывает в базу данных, оно преобразует байты в соответствии с кодировкой базы данных.
Итак... данные, записанные в базу данных из нашего приложения, выглядят корректно в базе данных, а данные из стороннего приложения — нет.
когда наше приложение пишет FirstName = Céline, оно сохраняется в базе данных как Céline
когда приложение веб-почты пишет FirstName = Céline, оно сохраняется в базе данных как Céline
Наше приложение CRM должно отображать контакты которые были созданы в любой системе. Итак, я пишу класс EncodingSniffer, который ищет помеченные символы, указывающие на плохо закодированную строку, и преобразует их.
в настоящее время у меня есть :
private static string[] _flaggedChars = new string[] { "é" };
, который отлично подходит для отображения Селин как Селин, но мне нужно добавить в список.
Кто-нибудь знает ресурс для получения всех возможных способов интерпретации специальных символов utf -8 как iso -8859 -1?
Спасибо
Уточнение: Так как я работаю в.Net. Струна,при загрузке в память из базы данных конвертируется в Unicode UTF -16. Так что вне зависимости от того, правильно ли он был закодирован в базе данных. Теперь он представлен как байты UTF16. Мне нужно иметь возможность проанализировать UTF -16 байт и определить, не испорчены ли они из-за того, что utf -8 байт вставлен в базу данных iso -8859 -1.... ясно как грязь да?
Вот что у меня есть. Он очистил отображение большинства неправильно закодированных символов, но у меня все еще есть проблемы с É например :Éric хранится в базе данных веб-почтой как Éric, но после обнаружения плохой кодировки и ее обратного изменения отображается как �?ric Глядя на пользователя, у которого есть 2500 контактов, сотни из которых имеют проблемы с кодировкой, É - единственное, что отображается неправильно...
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;
}
Итак, :É преобразуется в 195'Ã',8240' ‰'