2015-11-03 74 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 

我是......老實說不知道用戶怎麼會以此結束。這絕對不是故意輸入的內容。除非這是常見現象,否則我會忽略它。

相關問題