Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Проблема с кодировкой PHP + MySQL
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Проблема с кодировкой PHP + MySQL

Страниц (1): [1]
 

1. Shatun - 29 Апреля, 2007 - 10:37:21 - перейти к сообщению
Уже давно сделал поиск смайлов на сайте по ключевым словам, но вот в процессе использования этого скрипта многие не находят то, что ищут.
Например –в WIN1251 выглядит вот так - репа
А вот в кодировке Юникод (UTF8-8) означает Репа
Видимо у человека который осуществляет поиск по умолчанию установлена кодировка (UTF8-8) отсюда и возникает проблема т.е. такого слова в базе нет и скрипт сообщает, что мол нет такого.
Причём заметил что ищут с различными кодировками.


не очень хорошо знаю PHP, пожалуйста помогите решить эту проблему готовым куском кода.

Не сочтите за рекламу вот как это выглядит http://www[dot]animac[dot]ru/modules.php[dot][dot][dot]ile=searh_smiles
2. -SCHATTEN- - 29 Апреля, 2007 - 11:42:56 - перейти к сообщению
Мало чего понял, покажи сам скрипт поиска, или обьясни как он работает.
3. Shatun - 29 Апреля, 2007 - 14:43:24 - перейти к сообщению
-SCHATTEN-, благодарю за то, что желаешь помочь!

Так понимаю перед тем как запускается поиск в БД
$query должна быть в кодировке WIN 1251
может использовать
$query = convert_cyr_string ($query,w,k)
но у меня ничего не получается

код скрипта здесь – http://www[dot]animac[dot]ru/search[dot]txt
удалил некоторые функции (которые не имеют отношения к поиску) и для восприятия (моего кривого кода) прокомментировал действия
4. valenok - 29 Апреля, 2007 - 18:41:06 - перейти к сообщению
После подключения
PHP:
скопировать код в буфер обмена
  1.  
  2.  <?PHP  
  3.      mysql_query ("SET NAMES `cp1251`");  
  4.      mysql_query ("set character_set_client='cp1251'");    
  5.      mysql_query ("set character_set_results='cp1251'");    
  6.      mysql_query ("set collation_connection='cp1251_general_ci'");    
  7.    ?>
  8.  


и везде не WIN1251 а cp1251

Должно помочь.
Теперь в начале скрипта:
PHP:
скопировать код в буфер обмена
  1.  
  2. header('Content-Type: text/html; charset=cp1251');
  3.  
5. Shatun - 29 Апреля, 2007 - 22:06:01 - перейти к сообщению
valenok спасибо!

С
PHP:
скопировать код в буфер обмена
  1. <? header('Content-Type: text/html; charset=cp1251'); ?>

всё понятно

Но куда только не прикручивал
PHP:
скопировать код в буфер обмена
  1. <?       mysql_query ("SET NAMES `cp1251`");    
  2.       mysql_query ("set character_set_client='cp1251'");    
  3.       mysql_query ("set character_set_results='cp1251'");    
  4.       mysql_query ("set collation_connection='cp1251_general_ci'");     ?>

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

подскажите пожалуйста на примере.
Например есть запрос

PHP:
скопировать код в буфер обмена
  1. <?       $result = mysql_query("SELECT searh_query FROM ".$prefix."_imagegallery_search WHERE searh_query = '".$query."' "); ?>

как к нему правильно прикрутить вышеуказанный код?
6. valenok - 29 Апреля, 2007 - 22:55:14 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. mysql_connect('local','root','');
  4.  
  5. mysql_query ("SET NAMES `cp1251`");    
  6. mysql_query ("set character_set_client='cp1251'");      
  7. mysql_query ("set character_set_results='cp1251'");      
  8. mysql_query ("set collation_connection='cp1251_general_ci'");
  9.  
  10. $result = mysql_query("SELECT searh_query FROM ".$prefix."_imagegallery_search WHERE searh_query = '".$query."' ");
  11.  

7. Shatun - 30 Апреля, 2007 - 08:57:45 - перейти к сообщению
Ничего не выходит.

Может неправильно проверяю на локалке…

Что делаю:
Открываю страницу с поиском и принудительно указываю другую кодировку. Например - KOI8-R
(вид > кодировка >кирилица KOI8-R )
затем в поле поиска ($query) пишу привет жму найти, ничего не происходит.
Пишет - Искали: РТЙЧЕФ
Т.е. получается, что не перекодирует перед тем как искать привет в БД
нашёл готовый скрипт - перекодирование в нужную кодировку

PHP:
скопировать код в буфер обмена
  1. <?
  2. ########################################################
  3. // определение кодировки текста и перекодирование в нужную
  4. ########################################################
  5.  
  6. function convert_cyr_text($text,$convert_to=""){                                 // detect codepage of $text and return converted to $convert_to
  7. // Swed  http://collection.com.ua/webmaster
  8.   if(!$code_page)$convert_to = "w";                                              // by default convert to windows-1251
  9.   $countChars = count_chars($text);                                              // cont chars of text
  10.   $sums = array(                                                                 // set sums for each codepage
  11.    "w" => array("small" => array_sum(array_slice($countChars,224,32)),           // windows-1251 small chars
  12.                 "cap"   => array_sum(array_slice($countChars,192,32))),          // capitalize chars
  13.    "k" => array("small" => array_sum(array_slice($countChars,192,32)),           // koi8-r
  14.                 "cap"   => array_sum(array_slice($countChars,224,32))),
  15.    "i" => array("small" => array_sum(array_slice($countChars,208,32)),           // iso8859-5
  16.                 "cap"   => array_sum(array_slice($countChars,176,32))),
  17.    "a" => array("small" => array_sum(array_slice($countChars,160,16))+           // cp866
  18.                              array_sum(array_slice($countChars,224,16)),
  19.                 "cap"   => array_sum(array_slice($countChars,128,32))),
  20.    "m" => array("small" => array_sum(array_slice($countChars,223,32)),           // x-mac-cyrillic
  21.                 "cap"   => array_sum(array_slice($countChars,128,32))),
  22.   );
  23.   $max = max($sums);                                                             // get max values
  24.   foreach ($sums as $name => $codepage)
  25.    if ($codepage == $max) $convert_from = $name;                                 // get name current codepage
  26.   if ($convert_from == $convert_to) return $text;                                // retrun not converted
  27.   return convert_cyr_string($text,$convert_from,$convert_to);                    // return converted
  28. }
  29. ?>


может им можно воспользоваться заменив в нём $text на $query?
Попробовал, ничего не получилось Недовольство, огорчение Может нужно ещё что добавить? Или не правильно тестю работу скрипта?
Подскажите люди добрые как кодировку ненужную побороть..
8. evgenijj - 30 Апреля, 2007 - 10:24:47 - перейти к сообщению
Это очень примитивный алгоритм.

http://phpclub[dot]ru/faq/wakka.php?[dot][dot][dot]dings/encodings4
учитывает частоту повторения русских букв в тексте.

http://popoff[dot]donetsk[dot]ua/text/wo[dot][dot][dot]/libs/a/charset/
По заверению автора "функция специальным образом оптимизирована для конвертирования коротких фраз".

Но вообще, если строка, кодировку которой требуется определить, состоит всего из одного слова, вероятность неправильного определения кодировки будет велика.
9. Shatun - 30 Апреля, 2007 - 11:04:29 - перейти к сообщению
Уххх... ЁПРСТ!
evgenijj спасибо огромнейшее!
Как раньше не нашёл эту инф.
Пробую. Если получится отишись в этом посте.
10. Shatun - 05 Мая, 2007 - 00:19:35 - перейти к сообщению
Не получается Огорчение

Сам скрипт работает прекрасно..
Т.е. если создаю файл win.php в который полностью копирую библиотеку -
a.charset (скаченную Здесь )
а в самом конце пишу в различных кодировках
PHP:
скопировать код в буфер обмена
  1.  echo charset_x_win("свадьба")."- utf-8 <br />";
  2. echo charset_x_win("РТЙЧЕФ")." - koi-8r <br />";
  3. echo charset_x_win("ЯаШТХвФ")." - ISO не поддерживается :( <br />";

всё вроде работает:

свадьба- utf-8
привет - koi-8r
ЯаШТХвФ - ISO не поддерживается Недовольство, огорчение


Но как подцепить эту библиотеку к себе никак понять не могу Недовольство, огорчение
========

Всем огромнейшее спасибо!!


Может кому пригодиться

PHP:
скопировать код в буфер обмена
  1.  
  2. // вначале файла
  3. require("a.charset.php");
  4. // перед MySQL запросом переменная проверяется
  5. $query = charset_x_win($query);



Вы мне очень помогли!!

 

Powered by ExBB FM 1.0 RC1