2015-11-03 40 views
0

我在MySQL数据库中搜索utf8 enocded字符串时遇到问题。我有一个带有用户的社交网站,他们可以为他们的个人资料添加说明,因为在我的国家我们使用西里尔字母,很明显的是使用UTF8。我有一个搜索轮廓的描述搜索领域,它是这样的:在mysql中搜索utf8 enocded字符串,显示相同但utf代码不同

SELECT usr.* FROM user AS usr WHERE usr.city = '{$city}' AND usr.desc LIKE '%{$srch}%' 

我在PHP中使用此顺便说一下,在大多数的它的工作情况。问题在于某些搜索结果无法搜索,我发现问题在于某些用户出于某种原因具有某些字母的相同表示(所以字母显示完全相同),但其后面的编码是不一样。例如,文本:

编码,然后写在最常见的方式,同时使用键盘语言支持的大多数操作系统都当
'Оптички стакла' = ÐпÑиÑки ÑÑакла 

。但是这个字符串的某个用户:

'Oптички ​​​стaклa' = OпÑиÑки âÑÑaклa 

当用UTF8编码时输出一个不同的代码。因此,搜索不适用于所有情况,我不知道如何解决。我认为我的数据库设置正确,我尝试了很多组合,现在我没有想法。任何帮助,将不胜感激。

在此先感谢。

+0

check [this](http://stackoverflow.com/a/12158207/4595675) –

回答

0

我也发现情况就像@duskwuff说的那样,问题是不仅一个用户输入了这种数据,但至少很少见。我设法找到了一个解决方案。因为在任何情况下,这发生在字母'A','a','O','o'上,我只是检查单词中的每个字母,如果单词主要是ASCII,但是发现UTF8就像这样转换它:

function convert_ascii_to_utf($str) 
{ 
     $length = strlen($str); 
     $ascii = false; 
     $utf8 = false; 
     $mixed_encode = false; 

     //the new string 
     $new_str = ''; 

     //check for mixed encoding in the same string 
     for($i = 0; $i < $length; $i++) 
     { 
      if(mb_detect_encoding($str[$i]) == 'ASCII') 
      { 
       $ascii = true; 
      } 
      if(mb_detect_encoding($str[$i]) == 'UTF-8') 
      { 
       $utf8 = true; 
      } 

      if($ascii == true && $utf8 == true) 
      { 
       $mixed_encode = true; 
       break; 
      } 
     } 

     if($mixed_encode) 
     { 
      for($i = 0; $i < $length; $i++) 
      { 
       if($str[$i] == 'a') { $new_str .= 'а'; } 
       else if($str[$i] == 'A') { $new_str .= 'А'; } 
       else if($str[$i] == 'o') { $new_str .= 'о'; } 
       else if($str[$i] == 'O') { $new_str .= 'О'; } 
       else { $new_str .= $str[$i]; } 
      } 

      return $new_str; 
     } 
     else 
     { 
      return $str; 
     } 
    } 
0

这是“Mojibake”。它通常来自于

  • 你在客户端中的字节被正确编码为utf8(好)。
  • 您与SET NAMES latin1(或set_charset('latin1')或...)连接,可能是默认情况下。 (它应该是utf8。)
  • 表中的列可能已经或可能不是CHARACTER SET utf8,但应该是这样的。
1

第二个字符串是奇怪的。它具有拉丁语“O”而不是西里尔语“О”,两个拉丁语“a”代替西里尔文“а”,并且在第二个单词之前包含三个零宽度空格。这里是你输入的内容:

U+4F 'O' LATIN CAPITAL LETTER O 
U+43F 'п' CYRILLIC SMALL LETTER PE 
U+442 'т' CYRILLIC SMALL LETTER TE 
U+438 'и' CYRILLIC SMALL LETTER I 
U+447 'ч' CYRILLIC SMALL LETTER CHE 
U+43A 'к' CYRILLIC SMALL LETTER KA 
U+438 'и' CYRILLIC SMALL LETTER I 
U+20 ' ' SPACE 
U+200B  ZERO WIDTH SPACE 
U+200B  ZERO WIDTH SPACE 
U+200B  ZERO WIDTH SPACE 
U+441 'с' CYRILLIC SMALL LETTER ES 
U+442 'т' CYRILLIC SMALL LETTER TE 
U+61 'a' LATIN SMALL LETTER A 
U+43A 'к' CYRILLIC SMALL LETTER KA 
U+43B 'л' CYRILLIC SMALL LETTER EL 
U+61 'a' LATIN SMALL LETTER A 

我是......老实说不知道用户怎么会以此结束。这绝对不是故意输入的内容。除非这是常见现象,否则我会忽略它。

相关问题