2014-02-12 45 views
0

这是晚了,我的咖啡因IV运行低,所以我的头脑糊涂,我有问题寻找解决方案,我认为是一个简单的编码问题(我几乎没有经验处理用)。不正确的编码导致数据库查询问题

我有一个使用EF6代码优先的数据库,一切似乎工作良好,直到我从一个代码块中包含的网站论坛复制一些文本。我检查了头文件,它被认为是用UTF-8编码的。

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

我放弃从网站上的文字到记事本++与数据库查询的文字,看到他们看起来等于:

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

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

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

+0

感谢您的回复,@svick。所以,如果我得到两个视觉上相同的字符串,但计算机将它们解释为不同,我如何规范化所有进来的文本,以便比较我可以看到的内容而不是计算机解释的内容? – Josh

+0

@Josh我不认为有这样的事情,尤其是因为不同的字体可能会有不同的表现。 – svick