数据库查询导致问题的编码错误

时间:2014-02-12 10:52:04

标签: c# sql asp.net-mvc-4 encoding

现在已经很晚了,而且我的咖啡因IV很低,所以我的思绪很糟糕,我在寻找解决方案时遇到了问题,我认为这是一个简单的编码问题(我几乎没有处理过的经验)。

我有一个使用EF6 Code First的数据库,一切似乎都运行良好,直到我从一个代码块中包含的网站论坛复制一些文本。我检查了标题,它应该用UTF-8编码。

我基本上采用这个文本,将其拆分为一个字符串数组,并检查数据库中是否有与每行中的字符串匹配的记录。一切顺利,直到我遇到一个问题,字符串“Magnеtic”与我的数据库表中的任何内容都不匹配但是当我进入SQLMS并用LIKE'%Magnеtic%'查询表时,我得到了一个结果。

我使用数据库查询中的文本将网站上的文本删除到Notepad ++中,看到它们看起来相同:

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);
}

这个似乎删除了西里尔语编码的重音字符。结果不如预期,但DID有效。 结果:

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;
}

此方法未提供任何更改。

1 个答案:

答案 0 :(得分:0)

在这些情况下可以提供帮助的是将字符复制粘贴到Google中。在这种情况下,结果指向the Wikipedia article about the letter Ye in Cyrillic,它看起来与拉丁字母表中的E完全相同,但在Unicode中具有不同的编码。

这意味着你得到的结果是正确的:字符串“Magnеtic”看起来与“Magnetic”完全相同(至少使用普通字体),但它实际上是一个不同的字符串。