2014-02-12 2 views
0

Покойно, и мой кофеин IV работает низко, поэтому мой ум - это месиво, и у меня возникают проблемы с поиском решения того, что, по моему мнению, является простой проблемой кодирования (у меня почти нет опыта с).Некорректное кодирование, вызывающее проблемы с запросом DB

У меня есть БД, использующий EF6 Code First, и все, кажется, работает хорошо, пока я не скопирую какой-либо текст с форума сайта, содержащегося в кодеблоке. Я проверил заголовок и предположительно закодирован в UTF-8.

Я по существу беру этот текст, разбиваю его на массив строк и проверяю БД на запись, соответствующую строке в каждой строке. Все шло хорошо, пока я не столкнулся с проблемой с строкой «Magnеtic», не соответствующей ни на что в моей таблице DB, но когда я вошел в SQLMS и запросил таблицу с LIKE «% Magnеtic%», я получил результат.

Я уронил текст с веб-сайта в Notepad ++ с текстом из запроса DB и увидел, что они выглядят равными:

Magnеtic 
Magnеtic 

Затем я изменил кодировку ANSI, и он показал:

Magnetic <--From DB 
Magnеtic <--From website 

В моей голове появилась крошечная лампочка, но мои попытки исправить эту проблему потерпели неудачу.

Я попытался с помощью различных методов, но я думаю, что мой мозг жареным атаковать проблему с неправильными инструментами:

string.compare(a, b) == 0 
string.equals(a, b) 
string.ToUpperInvariant() 

и, вероятно, несколько других, которые я не могу вспомнить.

Итак, теперь вы знаете, в чем моя проблема, и я чувствую, что это такая простая проблема, но, как я уже сказал, я жареная и теперь нуждаюсь в помощи сообщества.

Я не профессиональный кодер, больше любитель, поэтому я не могу использовать лучшие практики или передовые методы, чтобы что-то делать.

Редактировать: Сегодня я сделал еще несколько поисков и нашел несколько методов, которые не сработали.

private string RemoveAccent(string txt) 
{ 
    byte[] bytes = Encoding.GetEncoding("Cyrillic").GetBytes(txt); 
    return Encoding.ASCII.GetString(bytes); 
} 

Этот, как представляется, удаляет акцентированные символы кириллической кодировки. Результат был не таким, как ожидалось, но он дал эффект. Результаты:

Magn?tic <- Computer interpretation 
Magnetic <- Visual representation 

Я также попытался:

private string RemoveAccent2(string txt) 
{ 
    char[] toReplace = "àèìòùÀÈÌÒÙ äëïöüÄËÏÖÜ âêîôûÂÊÎÔÛ áéíóúÁÉÍÓÚðÐýÝ ãñõÃÑÕšŠžŽçÇåÅøØ".ToCharArray(); 
    char[] replaceChars = "aeiouAEIOU aeiouAEIOU aeiouAEIOU aeiouAEIOUdDyY anoANOsSzZcCaAoO".ToCharArray(); 
    for (int i = 0; i < toReplace.Count(); i++) 
    { 
     txt = txt.Replace(toReplace[i], replaceChars[i]); 
    } 
    return txt; 
} 

Этот метод не предусматривает каких-либо изменений.

ответ

0

Что может помочь в этих случаях - скопировать-вставить символ в Google. В этом случае результаты указывают на the Wikipedia article about the letter Ye in Cyrillic, который выглядит точно так же, как E в латинском алфавите, но имеет различную кодировку в Юникоде.

Это означает, что результаты, которые вы получаете, верны: строка «Magnètic» выглядит точно так же, как «Magnetic» (по крайней мере, с использованием обычных шрифтов), но на самом деле это другая строка.

+0

Спасибо за ваш ответ, @svick.Итак, если я получаю две визуально идентичные строки, но компьютер интерпретирует их как разные, как я могу нормализовать весь текст, который приходит, чтобы я мог сравнивать то, что я вижу, а не то, что компьютер интерпретирует? – Josh

+0

@ Josh Я не думаю, что есть что-то в этом роде, тем более, что разные шрифты могут вести себя по-другому. – svick

Смежные вопросы