Обнаружение плохой UTF -8 кодировка :список плохих символов для прослушивания?

У меня есть база данных 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' ‰'

9
задан Michael 7 May 2012 в 18:41
поделиться